设计模式之行为型设计模式
-
最少知识原则 :我知道很少其他类的事情,不触及其他类的领域
-
依赖倒置原则:从依赖具体,变成我提供出要求,让别的类实现
-
单一职责原则:只做自己领域的事情
-
里氏替换原则:针对继承,不重写父类的实现,如果要实现多态度使用抽象
-
接口隔离原则:接口应该尽量的少,做的事情尽量的耦合低
-
开闭原则:对扩展开放,对修改关闭
行为模式
- 类行为模式:继承
- 对象行为模式:组合
模版模式
public abstract coffe(){
public void drink(){
this.hot();
this.run();
}
public void abstract hot();
public void abstract run();
}
策略模式
// 定义算法,这个模式没啥好说的,把东西抽成接口。基本上代码都这样实现的,抽出一个实现接口
命令模式
// MQ的实现模式。从队列里拿数据,可以解偶,异步,削峰。
责任链模式
// 非常多的if - else,有先后处理关系 和装饰者模式有点像
public class AbstractWebFilter{
public AbstractWebFilter abstractWebFilter;
public boolean isPass(Http http){
is(this.boolPass(http) && this.abstractWebFilter!=null){
return abstractWebFilter.isPass();
}
return this.boolPass(http);
}
private boolean abstract boolPass(Http http);
}
状态模式
// 状态模式 如果有几种状态,而且有客户有几种方法操作,我们根据state来决定操作
public interface buy{
public void buy();
}
class beforeSell impl buy{
private Mail mail;
public void buy(){
System.out.println("我已经买完了");
mail.state = afterSell;
}
}
class afterSell impl Buy{
private Mail mail;
public void Mail(){
System.out.println("你已经买过了")
}
}
class Mail{
public state;
public Mail(Buy buy){
this.state = buy;
}
public Mail sell(){
this.state.buy();
retrun this;
}
}
new Mail(new BeforeSell()).buy().buy();
// --- 我已经买完了
// --- 你已经买过了
观察者模式
// 发布订阅可以怎么弄
public class observer(){
private LIst<Subject> subjets = Lists.newArrrayList();
public void notifyAll(){
//所有subject执行notify()方法
}
}
public interface Subject(){
public void notify();
}
中介者模式
//单独弄出一个类,让互相耦合的类耦合当前类,比较简单就通过组合放进去中介者里面最简单的例子,springBoot的service就是中介者模式
迭代器模式
// 参考List的 iterator实现 只要实现hasNext 和next方法就可以访问下一个了之后遍历就可以用迭代器了
访问者模式
// 假设有用户买房子。不同的人不同的价格
public interface vistor{
public int buyHouse(House house);
}
//房子类
public class Seil{
private Vistor vistor;
List<House> houses = Lists.newArrayList();
public int BuyHouse(int i){
return vistor.buyHouse(house.get(i));
}
}
// 这里表示三个类的简写返回:普通人 1_vip 2_vip
class T impl vistor{
public int buyHouse(House house){
// 普通人
return house.price
// 穷逼vip
return house.price * 0.9;
//超级vip
return house.price * 0.6
}
}
//如果超级vip想买第二套房
seil.setVisitor(new 2_vip());
seil.buyHouse(1);
备忘录模式
// 用一个List备份当时的数据,恢复的时候弄弄回去就好了