GoF之外观模式、中介者模式详解

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();
}
}

欢迎关注公众号。 “专注一行代码”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值