设计模式-行为型模式(二)

七、观察者模式

观察者模式是指被观察者的状态发生改变时,系统基于事件驱动理论将其状态通知到订阅其状态的观察者对象中,以完成状态的修改和事件传播。

在观察者模式中,观察者和被观察者是抽象耦合的,两者之间建立了一套事件触发机制,以降低二者的耦合度。

观察者模式具体UML:

(1)定义抽象主题Subject:

public abstract class Subject {
    protected List<Observer> observers = new ArrayList<Observer>();
    public void add(Observer observer){
        observers.add(observer);
    }
    public void remove(Observer observer){
        observers.remove(observer);
    }
    //notifyObserver方法用来实现消息发生变化时将改变后的消息发送给观察者
    public abstract void notifyObserver(String message);
}

(2)定义具体主题ConcreteSubject:

public class ConcreteSubject extends Subject {
    private final static Log logger = LogFactory.getLog(ConcreteSubject.class);
    @Override
    public void notifyObserver(String message) {
        for(Object obs:observers){
            logger.info("观察者们注意--"+message+"--已经改变");
            ((Observer)obs).dataChange(message);
        }
    }
}

(3)定义抽象观察者:

public interface Observer {
    void dataChange(String message);
}

(4)定义具体的观察者:

public class ConcreteObserver implements Observer {
    private final static Log logger = LogFactory.getLog(ConcreteObserver.class);

    @Override
    public void dataChange(String message) {
        logger.info("观察者收到--"+message+"--的消息");
    }
}

(5)使用观察者模式:

public class Main {
    public static void main(String[] args) {
        Subject subject = new ConcreteSubject();
        Observer observer = new ConcreteObserver();

        subject.add(observer);
        subject.notifyObserver("数据发生改变");
    }
}

结果:

十二月 31, 2019 5:42:56 下午 com.jzq.sign.Observer.ConcreteSubject notifyObserver
信息: 观察者们注意--数据发生改变--已经改变
十二月 31, 2019 5:42:56 下午 com.jzq.sign.Observer.ConcreteObserver dataChange
信息: 观察者收到--数据发生改变--的消息

八、迭代器模式

迭代器模式提供了可以顺序访问集合对象中的各个元素,而不暴露对象内部结构的方法。

以Collection为例:

(1)定义集合接口Collection:

public interface Collection {
    public Iterator iterator();
    public Object get(int i);
    public boolean add(Object object);
    public int size();
}

(2)定义集合接口Collection的实现类ListCollection:

public class ListCollection implements Collection {
    public List list = new ArrayList();
    @Override
    public Iterator iterator() {
        return new ConcreteIterator(this);
    }

    @Override
    public Object get(int i) {
        return list.get(i);
    }

    @Override
    public boolean add(Object object) {
        list.add(object);
        return true;
    }

    @Override
    public int size() {
        return list.size();
    }
}

(3)定义迭代器接口Iterator:

public interface Iterator {
    public Object previous();
    public Object next();
    public boolean hasNext();
}

(4)定义迭代器接口Iterator的实现类ConcreteIterator:

public class ConcreteIterator implements Iterator {
    private Collection collection;
    private int pos = -1;
    public ConcreteIterator(Collection collection) {
        this.collection = collection;
    }

    @Override
    public Object previous() {
        if(pos>0){
            pos--;
        }
        return collection.get(pos);
    }

    @Override
    public Object next() {
        if(pos<collection.size()-1){
            pos++;
        }
        return collection.get(pos);
    }

    @Override
    public boolean hasNext() {
        if(pos<collection.size()-1){
            return true;
        }else{
            return false;
        }
    }
}

(5)使用迭代器:

public class Main {
    public static void main(String[] args) {
        Collection collection = new ListCollection();
        collection.add("object1");
        collection.add("object2");
        collection.add("object3");
        Iterator it = collection.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }
}

结果:

object1
object2
object3

九、备忘录模式

备忘录模式保存一个对象的某个状态,以便在适当的时候将该对象的状态恢复到原先保存的状态。

给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。

具体UML:

(1)定义原始数据Original:

public class Original {
    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public Original(String value) {
        this.value = value;
    }
    public Memento createMemento(){
        return new Memento(value);
    }
    public void restoreMemento(Memento memento){
        this.value = memento.getValue();
    }
}

(2)定义备忘录Memento:

public class Memento {
    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public Memento(String value) {
        this.value = value;
    }
}

(3)定义备忘录管理员Storage:

public class Storage {
    private Memento memento;

    public Storage(Memento memento) {
        this.memento = memento;
    }

    public Memento getMemento() {
        return memento;
    }

    public void setMemento(Memento memento) {
        this.memento = memento;
    }
}

(4)使用备忘录模式:

public class Main {
    public static void main(String[] args) {
        Original original = new Original("大枪");
        Storage storage = new Storage(original.createMemento());
        System.out.println("原始值为"+original.getValue());
        original.setValue("小枪");
        System.out.println("现值为"+original.getValue());
        original.restoreMemento(storage.getMemento());
        System.out.println("恢复之后值为"+original.getValue());
    }
}

结果:

原始值为大枪
现值为小枪
恢复之后值为大枪

十、状态模式

状态模式指给对象定义不同的状态,并为不同状态定义不同的行为,在对象状态发生变化时自动切换状态。

何时使用代码中包含大量与对象状态有关的条件语句。

以工作状态为例:

(1)定义AbstractState:

public abstract class AbstractState {
    public abstract void action(Context context);
}

(2)定义AbstractState的子类HolidayState、WorkState:

public class HolidayState extends AbstractState {
    private final static Log logger = LogFactory.getLog(HolidayState.class);
    @Override
    public void action(Context context) {
        logger.info("状态转为假期");
        logger.info("holiday action is travel, shopping,watch TV");
    }
}

public class WorkState extends AbstractState {
    private final static Log logger = LogFactory.getLog(WorkState.class);
    @Override
    public void action(Context context) {
        logger.info("状态转为工作日");
        logger.info("work state action is coding, meeting, design");
    }
}

(3)定义Context用于存储状态和执行不同状态下的行为:

public class Context {
    private AbstractState state;

    public AbstractState getState() {
        return state;
    }

    public void setState(AbstractState state) {
        this.state = state;
    }

    public Context(AbstractState state) {
        this.state = state;
    }
    public void action(){
        this.state.action(this);
    }
}

(4)使用状态模式:

public class Main {
    public static void main(String[] args) {
        Context context = new Context(new WorkState());
        context.action();

        context.setState(new HolidayState());
        context.action();
    }
}

结果:

十二月 31, 2019 9:02:47 下午 com.jzq.sign.State.WorkState action
信息: 状态转为工作日
十二月 31, 2019 9:02:47 下午 com.jzq.sign.State.WorkState action
信息: work state action is coding, meeting, design
十二月 31, 2019 9:02:47 下午 com.jzq.sign.State.HolidayState action
信息: 状态转为假期
十二月 31, 2019 9:02:47 下午 com.jzq.sign.State.HolidayState action
信息: holiday action is travel, shopping,watch TV

十一、中介者模式

中介者模式是将对象与对象之间的关系变为对象与中介者之间的关系,通过定义不同的中介者来改变对象之间的交互,降低对象之间的耦合度。

以租房为例:

(1)定义抽象类Colleague类:

public abstract class Colleague {
    protected  Mediator mediator;

    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }
    public abstract boolean operation(String message);
}

(2)定义Colleague实现类ColleagueLandlord代表房东:

public class ColleagueLandlord extends Colleague {
    private final static Log logger = LogFactory.getLog(ColleagueLandlord.class);
    @Override
    public boolean operation(String message) {
        logger.info("房东收到一条来自中介的信息--" + message);
        return true;
    }
}

(3)定义Colleague实现类ColleagueTenant代表找房人:

public class ColleagueTenant extends Colleague {
    private final static Log logger = LogFactory.getLog(ColleagueTenant.class);
    @Override
    public boolean operation(String message) {
        logger.info("找房人收到一条来自中介的信息--" + message);
        return true;
    }
}

(4)定义中介者Mediator抽象类:

public abstract class Mediator {
    protected Colleague colleagueTenant;
    protected Colleague colleagueLandlord;

    public Mediator(Colleague colleagueTenant, Colleague colleagueLandlord) {
        this.colleagueTenant = colleagueTenant;
        this.colleagueLandlord = colleagueLandlord;
    }
    //向找房人发送消息
    public abstract boolean notifyColleagueTenant(String message);
    //向房东发送消息
    public abstract boolean notifyColleagueLandlord(String message);
}

(5)定义Mediator实现类ConcreteMediator代表具体中介:

public class ConcreteMediator extends Mediator {
    public ConcreteMediator(Colleague colleagueTenant, Colleague colleagueLandlord) {
        super(colleagueTenant, colleagueLandlord);
    }

    @Override
    public boolean notifyColleagueTenant(String message) {
        if(colleagueTenant != null){
            return colleagueTenant.operation(message);
        }
        return false;
    }

    @Override
    public boolean notifyColleagueLandlord(String message) {
        if(colleagueLandlord != null){
            return colleagueLandlord.operation(message);
        }
        return false;
    }
}

(6)使用中介者模式:

public class Main {
    public static void main(String[] args) {
        Colleague colleagueTenant= new ColleagueTenant();
        Colleague colleagueLandlord= new ColleagueLandlord();

        ConcreteMediator concreteMediator = new ConcreteMediator(colleagueTenant,colleagueLandlord);
        boolean result = concreteMediator.notifyColleagueTenant("现有一室一厅,想租吗?");
        if(result){
            concreteMediator.notifyColleagueLandlord("租客很满意");
        }else{
            concreteMediator.notifyColleagueLandlord("租客不满意");
        }

    }
}

结果:

十二月 31, 2019 9:51:17 下午 com.jzq.sign.Mediator.ColleagueTenant operation
信息: 找房人收到一条来自中介的信息--现有一室一厅,想租吗?
十二月 31, 2019 9:51:17 下午 com.jzq.sign.Mediator.ColleagueLandlord operation
信息: 房东收到一条来自中介的信息--租客很满意

原文地址:https://www.cnblogs.com/strong-FE/p/12127677.html

时间: 2024-10-11 17:06:19

设计模式-行为型模式(二)的相关文章

C#设计模式-创建型模式(转)

一.简单工厂模式 简单工厂模式Simple Factory,又称静态工厂方法模式.它是类的创建模式.是由一个工厂对象决定创建出哪一种产品类的实例,是不同的工厂方法模式的一个特殊实现. 优点: u 模式的核心是工厂类,该类中含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅负责"消费"产品. u 简单工厂模式实现了对责任的分割. 缺点: u 当产品类有复杂的多层次等级结构时,工厂类只有它自己.以不变应万变. u 模式中工厂类集中了所

JDK 源码 阅读 - 2 - 设计模式 - 创建型模式

A.创建型模式 抽象工厂(Abstract Factory) javax.xml.parsers.DocumentBuilderFactory DocumentBuilderFactory通过FactoryFinder实例化具体的Factory. 使用例子: DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docBuilder

设计模式——创建型模式

简单的说我们可以把23种设计模式可以归为三大类,分别是创建型模式.结构型模式和行为型模式. 今天,首先看一下创建型模式.创建型设计模式包括5种:单例模式(Singleton).工厂方法模式(Factory Method).抽象工厂模式(Abstract Factory).建造者模式(Builder).原型模式(Prototype).  1.单例模式(Singleton)        1)简介 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式是一种常用的软件设计模式.在它的核心结

C++设计模式之建造者模式(二)

3.省略指挥者Director的建造者模式 指挥者类Director在建造者模式中扮演非常重要的作用,简单的Director类用于指导具体建造者如何构建产品,它按一定次序调用Builder的buildPartX()方法,控制调用的先后次序,并向客户端返回一个完整的产品对象.Direcotr针对抽象的建造者进行编程,如果需要不同的建造者,只需把建造者传入指挥者类,无需修改之前的代码. 在有些情况下,为了简化系统结构,可以省略指挥者Director,指挥者不再指导产品的创建过程.而是在Builder

浅析JAVA设计模式之工厂模式(二)

1 工厂方法模式简介 工厂方法 (Factroy Method) 模式:又称多态性工厂模式(Polymorphic Factory),在这种模式中,核心工厂不再是一个具体的类,而是一个抽象工厂,提供具体工厂实现的接口,具体创建产品交由子工厂去做,抽象工厂不涉及任何产品被实例化的细节.而不同等级的产品,就对应一个不同等级的工厂,如下图. 图1 1.1工厂方法模式(多态性工厂模式): 工厂方法模式有三个角色: 1. 抽象产品接口 2. 具体产品类 3. 抽象工厂接口 4.具体工厂类. 1.2工厂方法

设计模式06-原型模式

1. 概念 用原型的实例指定创建对象的种类,并且通过拷贝这些原型对象来创建新的对象   在java中直接实现Cloneable接口即可 2. 案例 /********************************************************************** * <pre> * FILE : PrototypeDemo.java * CLASS : PrototypeDemo * * AUTHOR : Liaokailin * * FUNCTION : TODO

设计模式之工厂模式 (二)

工厂模式分为三大类 简单工厂(SimpleFactory) 工厂方法模式(Factory Method) 抽象工厂模式(Abstract Factory) 动态工厂(Dynamic Factory,属于优化版简单工厂) 一.简单工厂 组成如下: (1) 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑.在java中它往往由一个具体类实现. (2) 抽象产品角色:它一般是具体产品继承的父类或者实现的接口.在java中由接口或者抽象类来实现. (3) 具体产品角色:工厂类所创建的对象就是此

【C#设计模式——创建型模式】抽象工厂模式

抽象工厂模式比工厂模式具有更高层次的抽象性.当要返回一系列相关类中的某一个,而每个类都能根据需要返回不同的对象时,可以选择这种模式.直接进入示例. 示例描述:完成花园的规划,多种花园种类,每个里面多种植物 编写一个基类Garden,Garden就是抽象工厂.它定义了具体类中的方法,并返回一系列相关类中的某个类. public class Garden { protected Plant center, shade, border; protected bool showCenter, showS

Java经典23种设计模式之创造型模式(二)

本文记录5种创造型模式的剩下两种:建造者模式(Builder).原型模式(PROTOTYPE). 一.建造者模式(别名:生成者模式) 将复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示.一个完整的建造者模式包含以下几个概念: 1.产品类 Product public class Person { private String head; private String body; private String foot; public String getHead() { ret

设计模式——行为型模式

继<设计模式--创建型模式>和<设计模式--结构型模式>之后,今天介绍一下行为型模式. 行为模式设计到算法和对象间的职责分配,不仅描述对象或类的模式,还描述他们之间的通信方式,客服了运行时难以跟踪的复杂的控制流,他们将你的注意力重控制流转移到对象间的关系上来.行为类模式采用继承机制在类间分派行为,例:模板方法模式.解释器模式:行为对象模式描述了一组相互对等的对象如何相互协作以完成其中任何一个对象都单独无法完成的任务,例:中介者模式.职责链模式.策略模式:其它的行为对象模式常将行为封