设计模式(五)观察者模式

观察者模式(Observer)是 JDK 中使用最多的模式之一

有时候,我们的对象需要在收到某些通知时及时作出响应,此时可以用观察者模式。观察者模式定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

图片来自《Head First 设计模式》

可以以订阅报纸类比,出版社作为发布者,所有订阅了报纸的用户,在有新报纸出版时,都会收到一份最新的报纸。只不过,在观察者模式中,出版社叫做 主题(Subject),订阅者叫 观察者(Observer)

阅读更多

设计模式(四)装饰器模式

在代码运行期间动态增加功能的方式,称之为装饰器(Decorator),装饰器的好处是,为一个类的对象添加新的功能,而无需继承。


装饰器模式例子

一个图形接口

1
2
3
public interface Shape {
void draw();
}

矩形

1
2
3
4
5
6
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("draw a rectangle");
}
}

矩形绘制

1
2
3
4
5
public static void main(String[] args) {
// 普通矩形
Shape rectangle = new Rectangle();
rectangle.draw();
}
阅读更多

设计模式(三)工厂模式

简单工厂模式

假设我们有一个发送机制,有两种发送模式:短信发送和邮件发送。具体要用哪种发送,由专门的工厂帮我们做就好,这就是工厂模式。

以消息发送为例,首先有一个发送接口

1
2
3
public interface Sender {
void send();
}

短信发送

1
2
3
4
5
6
public class MessageSender implements Sender {
@Override
public void send() {
System.out.println("Message sent !");
}
}

邮件发送

1
2
3
4
5
6
public class EmailSender implements Sender {
@Override
public void send() {
System.out.println("Email sent !");
}
}

我们是要发送邮件,还是发送短信,需要一个工厂来造。

阅读更多

设计模式(二)代理模式

假设我们需要转账,转账有支付宝和微信支付两种方式,两种方式的转账前都需要检查一下账户信息,转账后显示余额。我们可以提供一个代理人,专门帮我们做检查账户信息和显示余额这种切面工作,而转账类(无论是支付宝还是微信支付)只负责转账本身。这就是代理模式。

阅读更多

设计模式(一)会飞的鸭子(策略模式)

设计原则:

多用组合(composition),少用继承。


鸭子类

首先我们有一个鸭子类

1
2
3
4
5
public abstract class duck{
quack();
swim();
display();
}

然后具体是哪种鸭子,只要去继承这个鸭子类就好了。

比如 MallardDuck 重写 display() 方法,它就是绿头鸭。

1
2
3
4
5
6
public class MallardDuck extends duck{
@Overwrite
display(){
//... green
}
}

现在,我们得让鸭子能飞

1
2
3
4
5
6
public abstract class duck{
quack();
swim();
display();
fly(); // it fly
}

然后你会惊奇地发现,橡皮鸭(RubberDuck)居然飞起来了。这不科学!

阅读更多