1. Builder Pattern(建造者模式)
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
一个对象有多个属性,我们只希望构造一个指定某些特定属性的对象,最简单的方法就是为每一种情况提供一个构造函数;通过使用建造者模式,可以简化实现。
定义一个静态内部类Builder,内部的成员变量和外部类一样
Builder类通过一系列的方法用于成员变量的赋值,并返回当前对象本身(this)
Builder类提供一个build方法或者create方法用于创建对应的外部类,该方法内部调用了外部类的一个私有构造函数,该构造函数的参数就是内部类Builder
外部类提供一个私有构造函数供内部类调用,在该构造函数中完成成员变量的赋值,取值为Builder对象中对应的值
于是我们就可以这样创建Person类。
Person.Builder builder=new Person.Builder();
Person person=builder .name("张三")
.age(18)
.height(178.5)
.weight(67.4)
.build();
它分为抽象建造者(Builder)角色、具体建造者(ConcreteBuilder)角色、导演者(Director)角色、产品(Product)角色四个角色。
抽象建造者(Builder)角色:给 出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者 (ConcreteBuilder)角色。具体建造者类必须实现这个接口所要求的两种方法:一种是建造方法(buildPart1和 buildPart2),另一种是返还结构方法(retrieveResult)。一般来说,产品所包含的零件数目与建造方法的数目相符。换言之,有多少 零件,就有多少相应的建造方法。
具体建造者(ConcreteBuilder)角色:担任这个角色的是与应用程序紧密相关的一些类,它们在应用程序调用下创建产品的实例。这个角色要完成的任务包括:1.实现抽象建造者Builder所声明的接口,给出一步一步地完成创建产品实例的操作。2.在建造过程完成后,提供产品的实例。
导演者(Director)角色:担任这个角色的类调用具体建造者角色以创建产品对象。应当指出的是,导演者角色并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者角色。
产品(Product)角色:产品便是建造中的复杂对象。一般来说,一个系统中会有多于一个的产品类,而且这些产品类并不一定有共同的接口,而完全可以是不相关联的。
Builder
为创建一个Product对象的各个部件指定抽象接口。
ConcreteBuilder
实现Builder的接口以构造和装配该产品的各个部件。
定义并明确它所创建的表示。
提供一个检索产品的接口
(具体构建者可以有多个,从而实现不同的构建)
Director
构造一个使用Builder接口的对象。
Product
表示被构造的复杂对象。ConcreateBuilder创建该产品的内部表示并定义它的装配过程。
2. Adapter Pattern 适配器模式
Adapter Pattern分为两种:
类的Adapter Pattern(即所谓的继承)
对象的Adapter Pattern(即所谓的委托)
图片来自Android设计模式系列(9)--SDK源码之适配器模式
下面就以ListView为样例来剖析一下他的工作原理:
结构如下:第一步:构建BaseAdapter抽象父类
public abstract class BaseAdapter {
public String[] item; //ListView 中的子项Item
public String[] getItem() {
return item;
}
public void setItem(String[] item) {
this.item = item;
}
}
第二步:定义ListView方法的接口IListView
public interface IListView {
public void setAdapter(BaseAdapter adapter);
}
第三步:ListView组件类
public class ListView extends BaseAdapter implements IListView{
@Override
public void setAdapter(BaseAdapter adapter) {
this.setItem(adapter.getItem());
}
}
至此ListView组件已经成型,接下来完成适配器Adapter类
第四步:适配器接口IAdapter
public interface IAdapter { public void setData();}
第五步:生成适配器SimpleAdapter
public class SimpleAdapter extends BaseAdapter implements IAdapter{
ArrayList<HashMap< String,String>> arrayList;
String name;
public SimpleAdapter(ArrayList<HashMap< String,String>> arrayList,String name) {
this.arrayList=arrayList;
this.name=name;
this.item=new String[arrayList.size()];
setData();
}
@Override
public void setData() {
for(int i=0;i<arrayList.size();i++){
this.item=arrayList.get(i).get(name);
} }}
Ok,创建类结束!应用:
ListView listView=new ListView();
ArrayList<HashMap< String,String>> arrayList=new ArrayList<HashMap<String,String>>();
for(int i=0;i<10;i++){
HashMap<String,String> map=new HashMap<String, String>();
map.put("NAME", "Item"+i);
arrayList.add(map); }
SimpleAdapter adapter1=new SimpleAdapter(arrayList, "NAME");
listView.setAdapter(adapter1);
总结:
- 其实样例中的ListView与SimpleAdapter都是继承了抽象父类BaseAdapter,同时ListView又包裹了SimpleAdapter,从而实现了所谓的“适配”。
- 当然Android API中还有ArrayAdapter等其他适配器,不过原理同SimpleAdapter一样,比葫芦画瓢罢了…… , 这同时也解释了为什么我们在写 “自定义ListView” 时为什么要继承父类BaseAdapter!
- 同样的原理,不同的表现方式。
适配器模式设计原则:
1.使用对象组合,面向接口和抽象编程(万年不变)
2.“开闭”原则
使用场合:
1.软件系统结构需要升级或扩展,又不想影响原有的系统的稳定运行的时候;
2.转换类之间的差别不是太大的时候;
3.想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作时候。*
Builder模式:比如AlertDialog.Builder;例简单模拟Android中AlertDialog的Builder设计模式**
适配器模式:比如GridView、ListView与Adapter;例Android设计模式系列(9)--SDK源码之适配器模式**
命 令模式:比如Handler.post;例命令模式下的异步消息处理(Handler,Message,Looper,Thread)**
享 元模式:比如Message.obtain;例Android和设计模式:享元模式**
单 例模式:比如InputMethodManager.getInstance,例Android源码学习之单例模式应用**
观察者模式:比如ContentObserver;例Android中内容观察者的使用---- ContentObserver类详解**
抽象工厂模式:比如BaseActivity,例Android Ap 开发 设计模式第八篇:抽象工厂模式**
来自知乎:
作者:张明云链接: