设计模式自学笔记003_Real(观察者设计模式、外观设计模式)
一、观察者设计模式
在程序设计中,有的时候,我们的一个类(class1)的内容发生了改变,我们需要让其他的类根据class1的改变而做成相应的动作,那么就会用到观察者模式。我们需要有一个观察者类(Watcher1)来观察,如果头变动就去通知其他的类,让其他的类做出相应的改变。
举个例子:假设现在电脑分配给了我们一个或几个端口,然后一旦某一个端口有数据进入,那么我们就去通知与端口对应的程序进行某些操作,比如电脑分配给我们8888端口,负责8888端口的程序是QQ,那么我们设置一个观察者类扶额监听这个端口,一旦有人给我们发QQ消息,那么观察者类就会监听到,然后通知QQ程序,QQ就会响起QQ消息的音效。那么我们可以把代码实现一下。(代码实现了多个接口的监听)
//负责观察的接口类
public interface Monitor {
//监听端口的方法
void monitorPort(Applications app);
//通知APP的方法
void notifyApp();
}
import java.util.ArrayList;
public class Observer1 implements Monitor{
private ArrayList<Applications> AppArray = new ArrayList<>();
private Integer state = 0; //1表示来消息了
@Override
public void monitorPort(Applications app) {
AppArray.add(app);
}
@Override
public void notifyApp() {
AppArray.forEach(app -> app.Feedback());
}
}
//应用程序的接口类
public interface Applications {
void Feedback();
}
public class QQ implements Applications{
@Override
public void Feedback() {
System.out.println("嘀嘀嘀,QQ消息来了");
}
}
public class WeChat implements Applications{
@Override
public void Feedback() {
System.out.println("嘀嘀,微信消息来了");
}
}
//main方法的验证
public class ObserverDesign001 {
public static void main(String[] args) {
Monitor observer = new Observer1();
observer.monitorPort(new QQ());
observer.monitorPort(new WeChat());
observer.notifyApp();
}
}
二、外观设计模式
在程序设计中,有的时候我们需要一个对象腰用另一个系统里面的多个方法,而且有的时候可能需要按照一定的顺序进行调用,那么如果我们呢每次要用这个系统里面的方法每次都要将方法都调用一遍,非常的麻烦,那么外观设计模式就是先定义一个门面类(facade),让门面类创建系统的实例化对象,并创建方法来调用系统里面的多个方法,这样,我们在需要使用这个信息系统里面的方法的时候,我们只需要通过门面类来调用方法即可,这样就将系统与外界分隔开,外界不需要了解系统内部的结构,只需要通过门面类来实现自己想要的方法即可。
那么我们来举一个例子:假设我们现在有一个类class1,里面有一个方法fun1(),我们在使用fun1()时候需要调用类class2里面的fun2()方法、class3里面的fun3()方法、class4里面的fun4()方法。代码如下:
public class FacadeDesign1 {
public static void main(String[] args) {
Class1 class1 = new Class1(new Class2(), new Class3(), new Class4());
class1.fun1();
}
}
class Class1{
private Class2 class2;
private Class3 class3;
private Class4 class4;
public Class1(Class2 class2, Class3 class3, Class4 class4) {
this.class2 = class2;
this.class3 = class3;
this.class4 = class4;
}
public void fun1(){
System.out.println("调用了方法一");
class2.fun2();
class3.fun3();
class4.fun4();
}
}
class Class2{
public void fun2(){
System.out.println("调用了方法二");
}
}
class Class3{
public void fun3(){
System.out.println("调用了方法三");
}
}
class Class4{
public void fun4(){
System.out.println("调用了方法四");
}
}
应用:
1、对分层结构系统构建时,使用外观设计模式Dion工艺子系统中每层的入口可以简化系统之间的依赖关系。
2、当一个复杂系统的子系统很多的时候,外观设计模式可以为系统设计一个简单的接口供外界访问。
3、当客户端与子系统之间存在很大的联系的时候,引入外观设计模式可以将他们进行分离,从而提高子系统的独立性与可移植性。
优点:
1、降低子系统与客户端之间的耦合度,子系统的变化不会影响到其他的使用它的客户类。
2、对于客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。
3、降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程,因为编译一个子系统不会影响其他的子系统,也不会影响外观对象。
缺点:
1、不能很好的限制客户使用子系统类,很容易带来未知风险。
2、增加新的子系统需要修改外观类客户端的源代码,违背了“开闭原则”。