设计模式

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();

完整的构建者模式如下图所示:

设计模式_第1张图片
builder.jpg

它分为抽象建造者(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(即所谓的委托)

设计模式_第2张图片
Adapter.jpg

图片来自 Android设计模式系列(9)--SDK源码之适配器模式


设计模式android中的应用——适配器模式

下面就以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> arrayList; 
String name; 
public SimpleAdapter(ArrayList> 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

Ok,创建类结束!应用:

ListView listView=new ListView(); 
ArrayList> arrayList=new ArrayList>(); 
for(int i=0;i<10;i++){ 
HashMap map=new     HashMap(); 
map.put("NAME", "Item"+i); 
arrayList.add(map); } 
SimpleAdapter adapter1=new     SimpleAdapter(arrayList, "NAME"); 
listView.setAdapter(adapter1);

总结:

  1. 其实样例中的ListView与SimpleAdapter都是继承了抽象父类BaseAdapter,同时ListView又包裹了SimpleAdapter,从而实现了所谓的“适配”。
  2. 当然Android API中还有ArrayAdapter等其他适配器,不过原理同SimpleAdapter一样,比葫芦画瓢罢了…… , 这同时也解释了为什么我们在写 “自定义ListView” 时为什么要继承父类BaseAdapter!
  3. 同样的原理,不同的表现方式。

适配器模式设计原则:
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 开发 设计模式第八篇:抽象工厂模式**

来自知乎:
作者:张明云链接:

你可能感兴趣的:(设计模式)