设计模式(五)观察者模式
观察者模式(Observer)是 JDK 中使用最多的模式之一
有时候,我们的对象需要在收到某些通知时及时作出响应,此时可以用观察者模式。观察者模式定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
可以以订阅报纸类比,出版社作为发布者,所有订阅了报纸的用户,在有新报纸出版时,都会收到一份最新的报纸。只不过,在观察者模式中,出版社叫做 主题(Subject),订阅者叫 观察者(Observer)。
观察者模式(Observer)是 JDK 中使用最多的模式之一
有时候,我们的对象需要在收到某些通知时及时作出响应,此时可以用观察者模式。观察者模式定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
可以以订阅报纸类比,出版社作为发布者,所有订阅了报纸的用户,在有新报纸出版时,都会收到一份最新的报纸。只不过,在观察者模式中,出版社叫做 主题(Subject),订阅者叫 观察者(Observer)。
在代码运行期间动态增加功能的方式,称之为装饰器(Decorator),装饰器的好处是,为一个类的对象添加新的功能,而无需继承。
一个图形接口
1 | public interface Shape { |
矩形
1 | public class Rectangle implements Shape { |
矩形绘制
1 | public static void main(String[] args) { |
假设我们有一个发送机制,有两种发送模式:短信发送和邮件发送。具体要用哪种发送,由专门的工厂帮我们做就好,这就是工厂模式。
以消息发送为例,首先有一个发送接口
1 | public interface Sender { |
短信发送
1 | public class MessageSender implements Sender { |
邮件发送
1 | public class EmailSender implements Sender { |
我们是要发送邮件,还是发送短信,需要一个工厂来造。
假设我们需要转账,转账有支付宝和微信支付两种方式,两种方式的转账前都需要检查一下账户信息,转账后显示余额。我们可以提供一个代理人,专门帮我们做检查账户信息和显示余额这种切面工作,而转账类(无论是支付宝还是微信支付)只负责转账本身。这就是代理模式。
设计原则:
多用组合(composition),少用继承。
首先我们有一个鸭子类
1 | public abstract class duck{ |
然后具体是哪种鸭子,只要去继承这个鸭子类就好了。
比如 MallardDuck 重写 display()
方法,它就是绿头鸭。
1 | public class MallardDuck extends duck{ |
现在,我们得让鸭子能飞
1 | public abstract class duck{ |
然后你会惊奇地发现,橡皮鸭(RubberDuck)居然飞起来了。这不科学!