https://mp.weixin.qq.com/s/y8OMZB9jud1VXcrU3Y776A
外观(Facade Pattern)模式
为多个复杂的子系统提供一个一致的接口,使这些子系统更加容易被访问。
优点:
1、减少系统相互依赖。
2、提高灵活性。
3、提高了安全性。
缺点:
不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。
使用场景:
1、为复杂的模块或子系统提供外界访问的模块。
2、子系统相对独立。
3、预防低水平人员带来的风险。
具体实现:计算机包括CPU、内存、硬盘,用外观整合一起,启动或关闭计算机就不需要知道具体的CPU、内存、硬盘,只操作外观即可。
//计算机接口
public interface Computer{
void start();
}
//CPU
class Cpu implements Computer {
@Override
public void start() {
System.out.println(“启动CPU”);
}
}
//内存
class Ddr implements Computer {
@Override
public void start() {
System.out.println(“启动内存”);
}
}
//硬盘
class Ssd implements Computer {
@Override
public void start() {
System.out.println(“启动硬盘”);
}
}
//外观
public class Facade {
private Computer cpu;
private Computer ddr;
private Computer ssd;
//启动cpu
public void onCPU() {
cpu = new Cpu();
cpu.start();
}
//启动内存
public void onDDR() {
ddr = new Ddr();
ddr.start();
}
//启动硬盘
public void onSSD() {
ssd = new Ssd();
ssd.start();
}
}
//客户端一键启动计算机
public class Client {
public static void main(String[] args) {
Facadefacade = new Facade();
facade.onSSD();
facade.onDDR();
facade.onCPU();
}
}
中介者(Mediator Pattern)模式
定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解。就好像是房屋中介和婚姻介绍所。最典型的例子就是MVC。
优点:
1、降低了类的复杂度,将一对多转化成了一对一。
2、各个类之间的解耦。
3、符合迪米特原则。
缺点:
中介者会庞大,变得复杂难以维护。
使用场景:
1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。
具体实现:创建同事类和中介类,使同事类通过中介类进行通信交流。
//同事类的抽象父类。负责约束同事对象的类型,并实现一些具体同事类之间的公共功能。
public abstract class Colleague {
//持有中介者对象,每一个同事类都知道它的中介者对象
private Mediator mediator;
// 构造方法,传入中介者对象
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
//获取当前同事类对应的中介者对象
public Mediator getMediator() {
return mediator;
}
}
//具体的同事类A
public class ConcreteColleagueA extendsColleague {
public ConcreteColleagueA(Mediatormediator) {
super(mediator);
}
//示意方法,执行某些业务功能
public void someOperation() {
//在需要跟其他同事通信的时候,通知中介者对象
getMediator().changed(this);
}
}
//具体的同事类B
public class ConcreteColleagueB extendsColleague {
public ConcreteColleagueB(Mediatormediator) {
super(mediator);
}
//示意方法,执行某些业务功能
public void someOperation() {
//在需要跟其他同事通信的时候,通知中介者对象
getMediator().changed(this);
}
}
//中介者,定义各个同事对象通信的接口
public interface Mediator {
//同事对象在自身改变的时候来通知中介者的方法,
//让中介者去负责相应的与其他同事对象的交互
public void changed(Colleague colleague);
}
//具体的中介者实现,它需要了解并维护各个同事对象,并负责具体的协
调各同事对象的交互关系。
public class ConcreteMediator implementsMediator {
//持有并维护同事A
private ConcreteColleagueA colleagueA;
//持有并维护同事B
private ConcreteColleagueB colleagueB;
//设置中介者需要了解并维护的同事A对象
public void setConcreteColleagueA(ConcreteColleagueA colleague) {
colleagueA = colleague;
}
//设置中介者需要了解并维护的同事B对象
public void setConcreteColleagueB(ConcreteColleagueBcolleague) {
colleagueB = colleague;
}
public void changed(Colleaguecolleague) {
//某个同事类发生了变化,通常需要与其他同事交互
//具体协调相应的同事对象来实现协作行为
}
}
//客户端
public class Client {
public static void main(String[] args) {
//创建中介者——主板对象
MotherBoard mediator = new MotherBoard();
//创建同事类
CDDriver cd = new CDDriver(mediator);
CPU cpu = new CPU(mediator);
VideoCard vc = new VideoCard(mediator);
SoundCard sc = new SoundCard(mediator);
//让中介者知道所有的同事
mediator.setCdDriver(cd);
mediator.setCpu(cpu);
mediator.setVideoCard(vc);
mediator.setSoundCard(sc);
//开始看电影,把光盘放入光驱,光驱开始读盘
cd.readCD();
}
}
欢迎关注公众号。 “专注一行代码”