06 设计模式教学课件_第1页
06 设计模式教学课件_第2页
06 设计模式教学课件_第3页
06 设计模式教学课件_第4页
06 设计模式教学课件_第5页
已阅读5页,还剩42页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、装饰(Decorator)模式,循序渐进,从穿衣谈起: 写一个可以给人搭配不同服饰的程序,循序渐进,class Person private string name; public Person(string name) = name; public void WearTShirts() Console.Write(大T恤 ); ,public void WearBigTrouser() Console.Write(垮裤 ); public void WearSneakers() Console.Write(破球鞋 ); ,public void WearSuit() Co

2、nsole.Write(西装 ); public void WearTie() Console.Write(领带 ); ,public void WearLeatherShoes() Console.Write(皮鞋 ); public void Show() Console.WriteLine(装扮的0, name); ,客户端,static void Main(string args) Person xc = new Person(小菜); Console.WriteLine(n第一种装扮:); xc.WearTShirts(); xc.WearBigTrouser(); xc.WearS

3、neakers(); xc.Show();,Console.WriteLine(n第二种装扮:); xc.WearSuit(); xc.WearTie(); xc.WearLeatherShoes(); xc.Show(); Console.Read(); ,缺点,若要增加其它装扮,需要修改Person类,违背了开放封闭原则 试着将这些服饰写成子类,Person类,class Person private string name; public Person(string name) = name; public void Show() Console.WriteLine(

4、装扮的0, name); ,抽象类Finery,abstract class Finery public abstract void Show(); ,class TShirts : Finery public override void Show() Console.Write(大T恤 ); ,class BigTrouser : Finery public override void Show() Console.Write(垮裤 ); ,。,客户端,static void Main(string args) Person xc = new Person(小菜); Console.Writ

5、eLine(n第一种装扮:); Finery dtx = new TShirts(); Finery kk = new BigTrouser(); Finery pqx = new Sneakers(); dtx.Show(); kk.Show(); pqx.Show(); xc.Show();,Console.WriteLine(n第二种装扮:); Finery xz = new Suit(); Finery ld = new Tie(); Finery px = new LeatherShoes(); xz.Show(); ld.Show(); px.Show(); xc.Show();

6、Console.Read(); ,试着将装饰在内部组装完毕,Decorator,装饰(Decorator)模式又名包装(Wrapper)模式GOF95。 装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。,abstract class Component public abstract void Show(); ,class Person: Component public Person() private string name; public Person(string name) = name; public override void Show(

7、) Console.WriteLine(装扮的0, name); ,class Finery : Component protected Component component; public void Decorate(Component component) ponent = component; public override void Show() if (component != null) component.Show(); ,class TShirts : Finery public override void Show() Console.Write(大T恤 ); base.S

8、how(); class BigTrouser : Finery public override void Show() Console.Write(垮裤 ); base.Show(); ,class Sneakers : Finery public override void Show() Console.Write(破球鞋 ); base.Show(); class Suit : Finery public override void Show() Console.Write(西装 ); base.Show(); ,class Tie : Finery public override vo

9、id Show() Console.Write(领带 ); base.Show(); class LeatherShoes : Finery public override void Show() Console.Write(皮鞋 ); base.Show(); ,static void main(string args) Person xc = new Person(小菜); Console.WriteLine(n第一种装扮:); Sneakers pqx = new Sneakers(); BigTrouser kk = new BigTrouser(); TShirts dtx = ne

10、w TShirts(); pqx.Decorate(xc); kk.Decorate(pqx); dtx.Decorate(kk); dtx.Show();,Console.WriteLine(n第二种装扮:); LeatherShoes px = new LeatherShoes(); Tie ld = new Tie(); Suit xz = new Suit(); px.Decorate(xc); ld.Decorate(px); xz.Decorate(ld); xz.Show();,Console.WriteLine(n第三种装扮:); Sneakers pqx2 = new Sne

11、akers(); LeatherShoes px2 = new LeatherShoes(); BigTrouser kk2 = new BigTrouser(); Tie ld2 = new Tie(); pqx2.Decorate(xc); px2.Decorate(pqx2); kk2.Decorate(px2); ld2.Decorate(kk2); ld2.Show(); Console.Read(); ,另一种写法,abstract class Component public abstract void Show(); ,class Person: Component publi

12、c Person() private string name; public Person(string name) = name; public override void Show() Console.WriteLine(装扮的0, name); ,class Finery : Component protected Component component; public void Finery(Component component) ponent = component; public override void Show() if (component != nu

13、ll) component.Show(); ,class TShirts : Finery public TShirts(Component component):base(component) public override void Show() Console.Write(大T恤 ); base.Show(); ,static void main(string args) Component xc = new Person(小菜); Console.WriteLine(n第一种装扮:); Finery pqx = new Sneakers(xc); Finery kk = new Big

14、Trouser(pqx); Finery dtx = new TShirts(kk); dtx.Show(); ,上面的代码在执行装饰时是通过Decorate方法实现的 装饰模式常常被称为包裹模式,就是因为每一个具体装饰类都将下一个具体装饰类或者具体构件类包裹起来。,抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。 具体构件(Concrete Component)角色:实现组件对象接口,通常就是被装饰器装饰的对象。 装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。 具体装饰(Concrete

15、Decorator)角色:负责给构件对象贴上附加的责任。,装饰模式为对象添加额外责任的方式就像做蛋糕一样,一圈一圈的加上去,中间的面包是核心,是被装饰的对象(Person),是核心任务,外围的都是装饰对象。 这就是说装饰模式包含两部分内容,即装饰对象和被装饰对象。,按照GOF的说法,Decorator模式的意图是:动态的给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。 这个被装饰的对象不一定是最原始的那个对象,也可能是被其他装饰器装饰过的对象,反正都是实现的同一接口,也就是同一类型。 Decorator模式的效果是:让我们可以创建以decorator对

16、象-负责新的功能的对象-开始的一条对象“链”,并结束于最初的对象。,Decorator 链,继承和多态,装饰模式耍了这么绕,其实就用了两招,继承和多态。 所有组件都是Component 的子类,由Component 规划对象的行为(如,public void show();),装饰类Decorator 与 被装饰类Person 都是Component 的子类,那么他们具有相同的行为; 装饰类Decorator 也以Component 为成员变量,那他就有机会操作Component 的所有子类,而Decorator 的子类都override了Decorator 定义的接口,确切的说是Compon

17、ent 定义的接口,这样,各装饰类有了机会重写自己关心的装饰工作。,典型案例(JAVA中的I/O流),public class iotEST public static void main(String args) throws Exception DataInputStream din=null; try din=new DataInputStream( new BufferedInputStream( new FileInputStream(IOTest.txt) ) ); byte bs=new bytedin.available(); din.read(bs); String cont

18、ent=new String(bs); System.out.println(文件内容=+content); finally din.close(); ,同样的,输出流部分也类似,既然I/O流部分是采用装饰模式实现的,如果我们想要添加新的功能,只需要实现新的装饰器,然后再使用时,组合进去就可以。 自己实现的I/O流的装饰器 实现把英文加密存放。,public class EncryptOutputStream extends OutputStream private OutputStream os=null; public EncryptOutputStream(OutputStream os

19、) this.os=os; public void write(int a) throws IOException a=a+2; if(a=(97+26) a=a-26; this.os.write(a); ,public class iotEST public static void main(String args) throws Exception DataOutputStream dout=new DataOutputStream( new BufferedOutputStream( new EncryptOutputStream( new FileOutputStream(IOTest.txt); dout.write(abcdxyz.getBytes(); dout.close(); ,模式讲解,装饰模式的功能 能够实现动态地为对象添加功能,是从一个对象外部来给对象增加功能,相当于是改变了对象的外观。 对象组合 Favor Composition Over Inheritance。装饰模式的思考起点就是这个规则 装饰器和组件类的关系 装饰器是用来装饰组建

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论