设计模式c#语言描述——建造者模式、适配器模式、合成(Composite)模式

设计模式c#语言描述——建造者模式
<script language="javascript" src="/ad/js/edu_left_300-300.js" type="text/javascript"> </script>

设计模式c#语言描述——建造者(builder)模式

*本文参考了《JAVA与模式》的部分内容,适合于设计模式的初学者。

建造模式是对象的创建模式。建造模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。
一个产品常有不同的组成成分作为产品的零件,它们通常叫做产品的内部表象。不同的产品可以有不同的内部表象,也就是不同的零件。使用建造模式可以使客户不需要知道所生成的产品的对象有哪些零件,每个产品的对应零件彼此有何不同,是怎么建造出来的,以及怎样组成产品。下面是一个示例性的实现。

在这个示例性的系统中,最终产品Product只有两个零件,即Part1和Part2.相应的建造方法也有两个:builderPart1和builderPart2.可以看出本模式涉及到四个角色:

抽象建造者(Builder):给出一个抽象接口,以规范产品对象的各个组成部分的建造。

具体建造者(Concrete Builder):担任这个角色的是与应用程序紧密相关的一些类,它们在应用程序的调用下创建产品的实例。

导演者(Director):是与客户端打交道的角色,将创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体建造者。

产品(Product):建造中的对象。


Builder:

public interface Builder
{
void buildPart1();
void buildPart2();

Product retrieveResult();
}// END INTERFACE DEFINITION Builder

ConcreteBuilder:

public class ConcreteBuilder : Builder
{
private Product product;
public void buildPart1()
{
//build the first part of the product
}

public void buildPart2()
{
//build the second part of the product
}
public Product retrieveResult()
{
return product;
}

}// END CLASS DEFINITION ConcreteBuilder

Director:
public class Director
{
private Builder builder;

public void Director()
{ }

public void construct()//产品构造方法,负责调用各个零件建造方法
{
builder=new ConcreteBuilder();

builder.builderPart1();
builder.builderPart2();
builder.retrieveResult();
}

}// END CLASS DEFINITION Director

Product:

public interface Product
{
}// END INTERFACE DEFINITION Product

上面的系统中只有一个产品类,对应地也有一个具体建造者类。有多个产品及建造者类的建造模式如下图:

设计模式c#语言描述——适配器模式
<script language="javascript" src="/ad/js/edu_left_300-300.js" type="text/javascript"> </script>

设计模式c#语言描述——适配器(Adapter)模式

*本文参考了《JAVA与模式》的部分内容,适合于设计模式的初学者。

适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。包括类的适配器模式和对象的适配器模式两种不同的形式。

类的适配器模式把被适配的类的API转换成为目标类的API,其静态结构图如下:
模式的角色如下:

目标(Target)角色:这就是所期待得到的接口。注意这里讨论的是类的适配器模式,因此目标不可以是类。

源(Adaptee)角色:现有需要适配的接口。

适配器(Adapter)角色:把源接口转换成目标接口。

Target;

public interface Target
{
void sampleOperation1();
void sampleOperation2();//源类不包含的方法
}                 // END INTERFACE DEFINITION Target



Adaptee;

public class Adaptee
{
public void sampleOperation1()
{ }
}// END CLASS DEFINITION Adaptee

Adapter;

public class Adapter : Adaptee,Target
{
public void sampleOperation2()
{ }
}// END CLASS DEFINITION Adapter

类的适配器模式的效果:

使用一个具体类把源适配到目标中,这样一来,如果源以及源的子类都使用此类适配,就形不通了。

由于适配器类是源的子类,因此可以在适配器类中置换掉(Override)源的一些方法。

与类的适配器模式相似,对象的适配器模式把被适配的类的API转换成目标类的API,与类的适配器模式不同,对象的适配器模式不是使用继承关系连接到Adaptee类,而是使用委派关系,类图如下所示:


Target;

public interface Target
{
void sampleOperation1();
void sampleOperation2();

}// END INTERFACE DEFINITION Target

Adaptee;
public class Adaptee
{
public void sampleOperation1()
{ }

}// END CLASS DEFINITION Adaptee

Adapter:

public class Adapter : Target
{
private Adaptee adaptee;

public void Adapter(Adaptee adaptee)
{
this.adaptee=adaptee;
}
public void sampleOperation1()
{
adaptee.sampleOperation1();
}

public void sampleOperation2()
{ }

}// END CLASS DEFINITION Adapter


对象适配器模式的效果:

一个适配器可以把多种不同的源适配到同一个目标。也就是说,同一个适配器可以把源类和它的子类都适配到目标接口。

与类的适配器相比,要想置换源类的方法就不容易。如果一定要置换源类的方法,就只好先做一个源类的子类,将方法置换掉,再把源类的子类当作真正的源进行适配。

设计模式c#语言描述——合成(Composite)模式
<script language="javascript" src="/ad/js/edu_left_300-300.js" type="text/javascript"> </script>

设计模式c#语言描述——合成(Composite)模式



*本文参考了《JAVA与模式》的部分内容,适合于设计模式的初学者。



合成模型模式属于对象的结构模式,有时又叫做部分-整体模式。合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式可以使客户端将单纯元素与复合元素同等看待。如文件夹与文件就是合成模式的典型应用。根据模式所实现接口的区别,合成模式可分为安全式和透明式两种。



安全式的合成模式要求管理聚集的方法只出现在树枝构件类中,而不出现在树叶构件类中。类图如下所示:


涉及到三个角色:



抽象构件(Component):这是一个抽象角色,它给参加组合的对象定义公共的接口及其默认的行为,可以用来管理所有的子对象。合成对象通常把它所包含的子对象当做类型为Component的对象。在安全式的合成模式里,构件角色并不定义出管理子对象的方法,这一定义由树枝构件对象给出。

树叶构件(Leaf):树叶对象是没有下级子对象的对象,定义出参加组合的原始对象的行为。

树枝构件(Composite):代表参加组合的有下级子对象的对象。树枝构件类给出所有的管理子对象的方法,如Add(),Remove()等。



Component:

public interface Component
{

 void sampleOperation();

}// END INTERFACE DEFINITION Component

Leaf:

public class Leaf : Component
{
public void sampleOperation() 
{ }

}// END CLASS DEFINITION Leaf

Composite:

public class Composite :Component
{
private ArrayList componentList=new ArrayList();
public void sampleOperation()
{
System.Collections.IEnumerator myEnumerator = componentList.GetEnumerator();
while ( myEnumerator.MoveNext() )
{
((Component)myEnumerator.Current).sampleOperation();
}
}
public void add(Component component)
{
componentList.Add (component);
}

public void remove(Component component)
{
componentList.Remove (component);
}
}// END CLASS DEFINITION Composite

与安全式的合成模式不同的是,透明式的合成模式要求所有的具体构件类,不论树枝构件还是树叶构件,均符合一个固定的接口。类图如下所示:

抽象构件(Component):这是一个抽象角色,它给参加组合的对象定义公共的接口及其默认的行为,可以用来管理所有的子对象。要提供一个接口以规范取得和管理下层组件的接口,包括Add(),Remove()。

树叶构件(Leaf):树叶对象是没有下级子对象的对象,定义出参加组合的原始对象的行为。树叶对象会给出Add(),Remove()等方法的平庸实现。

树枝构件(Composite):代表参加组合的有下级子对象的对象。定义出这样的对象的行为。

Component:

public interface Component
{
void sampleOperation();
void add(Component component);
void remove(Component component);

}// END INTERFACE DEFINITION Component

Leaf:

public class Leaf : Component
{
private ArrayList componentList=null;
public void sampleOperation()
{ }

public void add(Component component)
{ }

public void remove(Component component)
{ }

}// END CLASS DEFINITION Leaf

Composite:

public class Composite :Component
{
private ArrayList componentList=new ArrayList();
public void sampleOperation()
{
System.Collections.IEnumerator myEnumerator = componentList.GetEnumerator();
while ( myEnumerator.MoveNext() )
{
((Component)myEnumerator.Current).sampleOperation();
}
}

public void add(Component component)
{
componentList.Add (component);
}

public void remove(Component component)
{
componentList.Remove (component);
}

}// END CLASS DEFINITION Composite

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值