装饰者模式的魅力

  1 using System;
  2
  3 namespace ConsoleApplication2
  4 {
  5     class Program
  6     {
  7         static void Main(string[] args)
  8         {
  9             //先造一部手机
 10             SJ sj = new SjLoad();
 11             //再给手机贴膜
 12             SJ sjm = new SJM(sj);
 13             Console.WriteLine(sjm.Getsj());
 14             //加了挂饰的手机
 15             SJ gs = new GS(sj);
 16             Console.WriteLine(gs.Getsj());
 17             //贴了膜又加挂饰手机
 18             SJ gsm = new GS(sjm);
 19             Console.WriteLine(gsm.Getsj());
 20
 21             //造人
 22             SJ ren = new Ren();
 23             //给枪
 24             SJ sq = new SQ(ren);
 25             //给容貌
 26             SJ rm = new RM(sq);
 27             Console.WriteLine(rm.Getsj());
 28             Console.Read();
 29         }
 30     }
 31
 32     //建造厂
 33     public abstract class SJ
 34     {
 35         //建造功能
 36         public abstract string Getsj();
 37     }
 38
 39     //先造一部手机
 40     public class SjLoad:SJ{
 41         public override string Getsj()
 42         {
 43             return "手机";
 44         }
 45     }
 46
 47     //给建造厂配备装饰功能
 48     public abstract class ZS:SJ
 49     {
 50         private SJ sj;   //准备装手机的容器
 51         public ZS(SJ s) //拿一个手机过来
 52         {
 53             this.sj = s;    //把手机装进容器
 54         }
 55
 56         //经过装饰的手机
 57         public override string Getsj()
 58         {
 59             return sj.Getsj();
 60         }
 61     }
 62
 63     //给手机贴膜
 64     public class SJM : ZS
 65     {
 66         public SJM(SJ sj)   //拿过来一个手机
 67             :base(sj)
 68         {
 69         }
 70         //给手机贴膜
 71         public override string Getsj()
 72         {
 73             return "贴了膜的"+base.Getsj();
 74         }
 75     }
 76
 77     //加挂饰
 78     public class GS : ZS
 79     {
 80         public GS(SJ sj):base(sj) { }
 81         public override string Getsj()
 82         {
 83             return "+挂饰"+base.Getsj();
 84         }
 85     }
 86
 87     //造个人
 88     public class Ren : SJ
 89     {
 90         public override string Getsj()
 91         {
 92             return "人";
 93         }
 94     }
 95
 96     //给人配一把手枪
 97     public class SQ : ZS
 98     {
 99         public SQ(SJ s) : base(s) { }   //把人抓过来
100         private string dsq = "拿着手枪的";
101         public override string Getsj()  //配手枪
102         {
103             return dsq+ base.Getsj();
104         }
105     }
106
107     //给人容貌
108     public class RM : ZS
109     {
110         public RM(SJ s) : base(s) { }
111
112         private string rmao = "英俊的";
113         public override string Getsj()
114         {
115             return rmao+ base.Getsj();
116         }
117     }
118 }
时间: 2024-11-07 21:26:18

装饰者模式的魅力的相关文章

设计模式(十):Decorator装饰者模式 -- 结构型模式

1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类—这建立在额外的代码上. 通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是静态的,用户不能控制增加行为的方式和时机.如果  你希望改变一个已经初始化的对象的行为,你怎么办?或者,你希望继承许多类的行为,改怎么办?前一个,只能在于运行时完成,后者

设计模式(八)装饰器模式Decorator(结构型)

设计模式(八)装饰器模式Decorator(结构型) 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类—这建立在额外的代码上. 通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是静态的,用户不能控制增加行为的方式和时机.如果  你希望改变一个已经初始化的对象的行为,你怎么办?或者,你希望继承许

Decorator模式 装饰器模式

Android 使用了装饰器模式 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类—这建立在额外的代码上. 通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是静态的,用户不能控制增加行为的方式和时机.如果  你希望改变一个已经初始化的对象的行为,你怎么办?或者,你希望继承许多类的行为,改怎么办

装饰者模式

* 通过使用修饰模式,可以在运行时扩充一个类的功能. * 原理是:增加一个修饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数. * 装饰类实现新的功能,而在不需要用到新功能的地方,它可以直接调用原来的类中的方法. * 修饰类必须和原来的类有相同的接口. * 修饰模式是类继承的另外一种选择.类继承在编译时候增加行为,而装饰模式是在运行时增加行为. * 当某个类具有多种可组合叠加的行为或属性时,装饰者模式可以通过动态增加装饰类,以避免排列组合,减少需要类的数量. 共同的

javascript设计模式学习之——装饰者模式

一.装饰者模式定义 装饰者模式可以动态地给某个对象添加一些额外的职责,而不会影响从这个类中派生的其他对象.这种为对象动态添加职责的方式就称为装饰者模式.装饰者对象和它所装饰的对象拥有一致的接口,对于用户来说是透明的. 和java等语言不同的是,java的装饰器模式是给对象动态添加职责,javascript中,给对象添加职责的能力是与生俱来的,更侧重于给函数动态添加职责. 二.java中的装饰者模式实现 package com.bobo.shejimoshi.derector; public cl

每天一段笔记-装饰者模式(Decorator pattern)

知识点 类应该对扩展开放,对修改封闭. 案例 (本故事纯属虚构) 某日早上,流年刚把新开发的游戏项目提交给经理 1 public abstract class Role 2 { 3 public virtual string RoleName { get; private set; } 4 public abstract int PhysicalAttack(); 5 } 1 class Samurai : Role 2 { 3 public override string RoleName 4

Java设计模式菜鸟系列(三)装饰者模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39759199 装饰者(Decorator)模式:动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更具有弹性的替代方案.对于装饰者模式,它其实是一种包装,所以我更愿意称它为一种包装.像咱们以前经常使用的Java里面的IO流就用到了装饰者模式.比如:BufferedReader br = new BufferedReader(new InputStreamReader(new Fi

JS设计模式之装饰者模式

装饰者模式概述 在不改变原对象的基础上,通过对其进行包装拓展(添加属性或者方法)使原有对象可以满足用户更复杂的需求 实际需求 在已有的代码基础上,为每个表单中的input默认输入框上边显示一行提示文案,当用户点击输入框时文案消失 原有代码: var telInput = document.getElementById('tel_input'); var telWarnText = document.getElementById('tel_warn_text'); input.onclick =

Java设计模式の装饰者模式

目录 一.问题引入 二.设计原则 三.用装饰者模式解决问题 四.装饰者模式的特点 五.装饰者模式的定义 六.装饰者模式的实现 七.java.io包内的装饰者模式 一.问题引入 咖啡店的类设计: 一个饮料基类,各种饮料类继承这个基类,并且计算各自的价钱. 饮料中需要加入各种调料,考虑在基类中加入一些布尔值变量代表是否加入各种调料,基类的cost()中的计算各种调料的价钱,子类覆盖cost(),并且在其中调用超类的cost(),加上特定饮料的价钱,计算出子类特定饮料的价钱. 缺点:类数量爆炸.基类加