行为型设计模式:(上)

目录

1.观察者模式

2.责任链模式

3.命令模式

4.迭代器模式


 

1.观察者模式

package designPattern;


import java.util.ArrayList;
import java.util.List;

/**
 * 行为模式:观察者模式
 * 使用两个进制观察者,观察一个十进制数的变化,对应输出该十进制对应的二进制和十六进制
 */
public class ObserverPattern {
    public static void main(String[] args) {
        ObservationTarget observationTarget = new ObservationTarget();
        BinObserver binObserver = new BinObserver(observationTarget);
        HexObserver hexObserver = new HexObserver(observationTarget);

        observationTarget.setNumber(23);
        observationTarget.setNumber(65);
    }
}

/**
 * 观察目标
 */
class ObservationTarget {
    //观察数
    private int number;
    //观察次对象的观察者列表
    private List<Observer> observerList = new ArrayList<>();

    public void setNumber(int number) {
        this.number = number;
        //通知观察者
        notifyAllObserver();
    }

    public int getNumber() {
        return number;
    }

    public void addObserver(Observer observer) {
        observerList.add(observer);
    }

    //更新后通知所有观察者
    public void notifyAllObserver() {
        for (Observer observer : observerList) {
            observer.update();
        }
    }
}

/**
 * 观察者抽象类
 */
abstract class Observer {
    //要观察的目标
    protected ObservationTarget observationTarget;

    //更新观察结果
    public abstract void update();
}

/**
 * 创建不同进制的观察者
 */

class BinObserver extends Observer {
    public BinObserver(ObservationTarget observationTarget) {
        this.observationTarget = observationTarget;
        this.observationTarget.addObserver(this);
    }

    @Override
    public void update() {
        System.out.println("bin: " + Integer.toBinaryString(observationTarget.getNumber()));
    }
}

class HexObserver extends Observer {
    public HexObserver(ObservationTarget observationTarget) {
        this.observationTarget = observationTarget;
        this.observationTarget.addObserver(this);
    }

    @Override
    public void update() {
        System.out.println("hex: " + Integer.toHexString(observationTarget.getNumber()));
    }
}

2.责任链模式

package designPattern;

/**
 * 行为型设计模式:责任链模式
 * 假设在一个工厂内有三种产品(编号A,B,C)需要被加工,此时有三名工人(1,2,3),其中一号工人只能加工A产品,二号为B,三号为C,
 * 现给一号工人一大堆该三种产品(打乱),开始进行加工,如果此产品自己不可加工,则传到下一个工人,依次直至产品加工完
 */
public class ResponsibilityPattern {
    public static void main(String[] args) {
        Work1 work1 = new Work1();
        Work2 work2 = new Work2();
        Work3 work3 = new Work3();
        work1.setNextWorker(work2);
        work2.setNextWorker(work3);
        //五个产品
        String[] products = {"B", "C", "A", "C", "B"};
        for (String p : products) work1.work(p);
    }
}

abstract class Worker {
    //责任链上的下一个工人
    protected Worker nextWorker;

    public void setNextWorker(Worker nextWorker) {
        this.nextWorker = nextWorker;
    }

    //工人们开始工作
    abstract public void work(String product);
}

//三种类型的工人
class Work1 extends Worker {
    @Override
    public void work(String product) {
        if (product.equalsIgnoreCase("A")) System.out.println("工人1加工了一个产品A");
        else if (nextWorker != null) nextWorker.work(product);
    }
}

class Work2 extends Worker {
    @Override
    public void work(String product) {
        if (product.equalsIgnoreCase("B")) System.out.println("工人2加工了一个产品B");
        else if (nextWorker != null) nextWorker.work(product);
    }
}

class Work3 extends Worker {

    @Override
    public void work(String product) {
        if (product.equalsIgnoreCase("C")) System.out.println("工人3加工了一个产品C");
        else if (nextWorker != null) nextWorker.work(product);
    }
}

3.命令模式

package designPattern;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;

/**
 * 行为型设计模式:命令模式
 * 将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化
 * 就拿windows的命令窗口举例
 */
public class CommandPattern {


    public static void main(String[] args) {
        CMD cmd = new CMD();

        CLSOrder clsOrder = new CLSOrder(cmd);
        DIROrder dirOrder = new DIROrder(cmd);
        CDOrder cdOrder = new CDOrder(cmd);

        CommandStack commandStack = new CommandStack();
        commandStack.addOrder(clsOrder);
        commandStack.addOrder(dirOrder);
        commandStack.addOrder(cdOrder);
        commandStack.executeAllOrder();
    }
}


/**
 * cmd类
 */
class CMD {
    //执行命令
    public void execute(String command) {
        if (command.equalsIgnoreCase("cls")) System.out.println("执行cls命令");
        else if (command.equalsIgnoreCase("dir")) System.out.println("执行dir命令");
        else if (command.equalsIgnoreCase("cd")) System.out.println("执行cd命令");
    }
}

interface Order {
    void executeCommand();
}

class CLSOrder implements Order {
    private CMD cmd;

    public CLSOrder(CMD cmd) {
        this.cmd = cmd;
    }

    @Override
    public void executeCommand() {
        cmd.execute("cls");
    }
}

class DIROrder implements Order {
    private CMD cmd;

    public DIROrder(CMD cmd) {
        this.cmd = cmd;
    }

    @Override
    public void executeCommand() {
        cmd.execute("dir");
    }
}

class CDOrder implements Order {
    private CMD cmd;

    public CDOrder(CMD cmd) {
        this.cmd = cmd;
    }

    @Override
    public void executeCommand() {
        cmd.execute("cd");
    }
}

/**
 * 命令栈
 */
class CommandStack {
    List<Order> orderList = new ArrayList<>();

    public void addOrder(Order order) {
        orderList.add(order);
    }

    public void executeAllOrder() {
        for (Order order : orderList) order.executeCommand();
        orderList.clear();
    }
}

4.迭代器模式

Java集合框架中的迭代器Iterator就是 迭代器模式的一个很好例子,以下模仿演示

public class Main {
    public static void main(String[] args) {
        NameRepository nameRepository = new NameRepository();
        Iterator iterator = nameRepository.getIterator();
        while (iterator.hasNext()) System.out.println(iterator.next());
    }
}

interface Iterator {
    public boolean hasNext();

    public Object next();
}

interface Container {
    public Iterator getIterator();
}

class NameRepository implements Container {
    public String names[] = {"Robert", "John", "Julie", "Lora"};

    @Override
    public Iterator getIterator() {
        return new NameIterator();
    }

    private class NameIterator implements Iterator {

        int index;

        @Override
        public boolean hasNext() {
            if (index < names.length) {
                return true;
            }
            return false;
        }

        @Override
        public Object next() {
            if (this.hasNext()) {
                return names[index++];
            }
            return null;
        }
    }
}
发布了58 篇原创文章 · 获赞 75 · 访问量 6648

猜你喜欢

转载自blog.csdn.net/qq_42013035/article/details/103821029