【设计模式】行为型模式(职责链、命令、迭代器、中介者、备忘录、观察者、状态、策略、模板方法、访问者

1.职责链模式

用途:避免请求发送者与接收者耦合在一起
在这里插入图片描述

//Client
SearchContext jContext = new JavaSearchContext(); //查询
SearchContext sContext = new SQLSearchContext();
SearchContext uContext = new UMLSearchContext();
//设置查询顺序 jContext → sContext → uContext  当某个“系统”查询成功则不再下行继续
jContext.setSuccessor(sContext);
sContext.setSuccessor(uContext);
String keyWord = "UML是啥"
jContext.search(keyWord); //search中查询未果,则转发个下一个查询系统

说明:沿着这条链传递请求,知道有对象处理它为止

2.命令模式

用途:对发送者和接收者完全解耦
在这里插入图片描述

BoardScreen screen = new BoardScreen(); //接收者
Menu menu = screen.getMenu();
Command openCommand,createCommand,editCommand; //命令
openCommand = new OpenCommand(screen);
MenuItem openItem,createItem,editItem; //调用者
openItem = (MenuItem)menu.itemList.get(0); //取出
openItem.setCommand(openCommand);
openItem.click();

说明:BoardScreen实例化会利用组合创建Menu,且MenuItem实例化将填充ArrayList,即BoardSreen只有这么多MenuItem操作可选。
取出MenuItem然后附加命令,点击click() → 对应的command.excuate() → 对应的screen.*()

3.迭代器模式(常用)

在这里插入图片描述

//Client
String[] pNames = {
    
    "ThinkPad","HuaWei_PC","XiaoMi_Watch"};
AbstractProductList list = new ProductList(pNames); //聚合对象
AbstractIterator iterator = list.getIterator(); //return new MyIterator(this); 
//在MyIteration实例化时获取了聚合对象this相关长度等参数,便于遍历

说明:
聚合对象职责:存储内部数据;遍历内部数据

4.中介者模式

用途:同事间不直接通信,借助中介者。将网状结构转变为以中介者为中心的星型结构
在这里插入图片描述

//Client
TemperatureConvertorDilog dialog = new TemperatureConvertorDilog();
...实例化具体同事类,并设置统一的中介者 .setDialog(dialog)
...中介者的聚合成员变量指向对应的对象
//某一同事调用change()方法(内含dialog.widgetChaged(this) 中介者根据这个this去判断执行change方法的具体同事类别(与成员变量指向的对象比较方可),以触发对应的响应)

说明
具体中介者成员变量有所有具体同事对象的聚合关联

5.备忘录模式

用途:实现备份和撤销
在这里插入图片描述
说明:负责人通过geter/setter方法取/存备忘录,对应原发器可 从备忘录恢复场景/将当前保存到备忘录
缺点:资源消耗过大,类成员变量多,会占用大量内存

6.观察者模式(常用)

用途:一对多的依赖关系,支持广播通信。 优点:表示层和数据逻辑层分离
在这里插入图片描述

class Stock{
    
    
    public vodi notifyInvestor(){
    
    
        for(Object obj:investors){
    
     //每个观察者都响应当下状态
            ((Investor)obj).response(this); //this为Stock对象的当下状态
        }
    }
}
//Client
1.实例化多个观察者 并attach进investors
2.当价格波动满足某一条件,通知观察者

7.状态模式

在这里插入图片描述

Account acc =new Account("XYZ",5.0)//实例化时构造器中会给初始状态
//存取款导致当前状态发生转变为别的状态

缺点:需事先确定状态种类,增加新状态违反开闭原则

8.策略模式

用途:把行为与环境分离开
在这里插入图片描述

//Client
MovieTicket mt = new MovieTicket();
mt.setPrice(50.0);
Discount stu =new StudentDiscount();
mt.setDiscount(stu);
mt.getPrice();//return discount.calculate(this.price) 此时discount为stu

说明:
针对不同的用户类型,给予不同的折扣计算策略

9.模板方法模式

优点:定义详细的处理算法时不改变算法的结构
在这里插入图片描述
说明:(流程)套路process已经形成,执行次序不可更改,可变更的是抽象方法的重写

10.访问者模式(不常用)

在这里插入图片描述

//Client
CandidateList list = new CandidateList();
...实例化不同的具体元素 存储进list
AwardCheck sac = new ScientficAwardCheck();
list.accept(sac); //该访问者去访问list中的每一个具体元素 即迭代list 调用具体元素的accept() 内含sac.visit(this)

猜你喜欢

转载自blog.csdn.net/qq_40265247/article/details/108044495