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)