Android 设计模式情景分析——观察者模式
Posted 一叶知秋V
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 设计模式情景分析——观察者模式相关的知识,希望对你有一定的参考价值。
当我们遇到类似汽车的装配,需要车轮、方向盘、发动机,还有各种小零件时,为了在构建过程中隐藏实现细节,就可以使用建造者模式 (Builder模式) 将部件和组装过程分离,使得构建过程和部件都可以自由扩展,两者之间的耦合也降到最低。建造者模式是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示的设计模式。
建造者模式的使用情景:
- 相同的方法,不同的执行顺序,产生不同的事件结果时;
- 多个部件,都可以装配到一个对象中,但是产生的运行结果又不相同时;
- 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的作用时;
- 当初始化一个对象特别复杂时;
建造者模式在 Java 开发中也较为常用,通常作为配置类的构造器将配置的构建和表示分离开来,同时也是将配置从目标类中隔离出来,避免过多的 setter 方法。
1.建造者模式
建造者模式 | |
---|---|
优点 | 1、良好的封装性,使用建造者模式可以使客户端不必知道产品内部组成的细节; 2、建造者独立,扩展性好; |
缺点 | 1、会产生多余的 Builder 对象,消耗内存; |
经典模式 UML 类图:
- Product 产品类:产品的抽象类
- Builder:抽象 Builder 类,规范产品的组建
- ConcreteBuilder:具体的 Builder 类
- Director:统一组装过程
简化模式 链式调用 UML 类图:
- Product 产品类:产品的抽象类
- Builder:抽象 Builder 类,规范产品的组建
- ConcreteBuilder:具体的 Builder 类,链式调用
本篇我们给出的实现都是基于链式调用的。
1.链式调用
1、定义 Product 产品类(以组装计算机为例):
public abstract class Computer {
protected String board;
protected String display;
protected String os;
protected Computer() {
}
// 设置主板
public void setmBoard(String board) {
this.board = board;
}
// 设置显示器
public void setmDisplay(String display) {
this.display = display;
}
// 设置操作系统
public abstract void setmOS();
@Override
public String toString() {
return "Computer{" + "board='" + board + '\\'' + ", display='" + display + '\\'' +
", os='" + os + '\\'' + '}';
}
}
具体的 Computer 类:
public class MacBook extends Computer {
protected MacBook() {
}
@Override
public void setmOS() {
os = "mac OS Sierra";
}
}
2、定义抽象 Builder 类,规范产品的组建:
public abstract class Builder {
// 设置主板
public abstract Builder setBoard(String board);
// 设置显示器
public abstract Builder setDisplay(String display);
// 设置操作系统
public abstract Builder setOS();
// 创建 Computer
public abstract Computer create();
}
具体的 Builder 类:
public class MacBookBuilder extends Builder {
private Computer mComputer = new MacBook();
@Override
public Builder setBoard(String board) {
mComputer.setmBoard(board);
return this;
}
@Override
public Builder setDisplay(String display) {
mComputer.setmDisplay(display);
return this;
}
@Override
public Builder setOS() {
mComputer.setmOS();
return this;
}
@Override
public Computer create() {
return mComputer;
}
}
链式调用的关键点是每个 setter 方法都返回自身,也就是 return this; 这样就使得 setter 方法可以为链式调用。
测试代码:
@Test
public void test() throws Exception {
// 链式调用
Computer computer = new MacBookBuilder().setBoard("Intel").setDisplay("Retina").setOS().create();
}
以上是关于Android 设计模式情景分析——观察者模式的主要内容,如果未能解决你的问题,请参考以下文章