设计模式之装饰器
2009-08-21 09:53
429 查看
装饰器顾名思义就是给一个人带发夹,带首饰打扮打扮。也就是给现有的对象添加新东西,这就引起一个话题,为什么大家不用继承呢?如果要加多个新东西,难道我们每加个东西就要继承前面一个对象,这显然会造成混乱,会使类不断的膨胀。而装饰器模式就避免了这样的问题。说了这么多装饰器模式主要防止类膨胀,他的特点:
1 原始对象对装饰器一无所知。也不知道数量。
2 各个装饰器(也可以说对象)彼此独立,发夹是发夹,首饰是首饰,靴子是靴子,他们之间不与其他装饰器发生冲突。
3 各个装饰器可以随意配对在一起。
4 不需要引入一个包含各种装饰的特性类??????
现在做个例子,有个女孩(componet)要打扮自己,她可以配 发夹(decarator),可以穿 靴子(decarator),可以穿 丝袜(decarator).这个女孩可以随意搭配这些装饰品。
首先 我们定义下 发夹 靴子 丝袜 三个对象装饰品。
下面在定义一个女孩主体。
然后我们实现她。看看女孩长什么样
输出结果
总结
存在一些组件而无法继承它
你希望为他们额外添加行为或者状态,改变该类中某些对象,且没有影响该类其他对象。
而这些行为和状态,你在项目执行时却无法获知。
比较
Decorator 装饰器模式:采用组装整合其他对象来实现,没有使用继承类或者接口实现。
Adapter 适配器模式: 在不同类中通过接口搭接起来。
Composite组合模式:聚集具有接口的对象而无需继承其对象接口。
1 原始对象对装饰器一无所知。也不知道数量。
2 各个装饰器(也可以说对象)彼此独立,发夹是发夹,首饰是首饰,靴子是靴子,他们之间不与其他装饰器发生冲突。
3 各个装饰器可以随意配对在一起。
4 不需要引入一个包含各种装饰的特性类??????
现在做个例子,有个女孩(componet)要打扮自己,她可以配 发夹(decarator),可以穿 靴子(decarator),可以穿 丝袜(decarator).这个女孩可以随意搭配这些装饰品。
首先 我们定义下 发夹 靴子 丝袜 三个对象装饰品。
public class BootsDecorator { /// <summary> /// 靴子 /// </summary> /// <param name="Size"></param> public BootsDecorator(string Size) { size=Size; } private string size; public override string ToString() { return string.Format("穿着{0}鞋",size); } } public class StockingsDecorator { /// <summary> /// 丝袜 /// </summary> /// <param name="Shape"></param> /// <param name="Color"></param> /// <param name="Size"></param> public StockingsDecorator(string Shape,string Color,string Size) { shape = Shape; color=Color; size = Size; } private string shape; private string color; private string size; public override string ToString() { return string.Format("穿着{0}{1}{2}丝袜", size, color, shape); } } /// <summary> /// 发夹 /// </summary> public class HairpinDecorator { public HairpinDecorator(string Color) { color = Color; } private string color; public override string ToString() { return string.Format("戴着{0}发夹的", color); } }
下面在定义一个女孩主体。
public class Girl { /// <summary> /// 鞋子 /// </summary> private BootsDecorator _bt; /// <summary> /// 丝袜 /// </summary> private StockingsDecorator _stk; /// <summary> /// 发夹 /// </summary> private HairpinDecorator _hp; /// <summary> /// 鞋子和丝袜混搭mix macth /// </summary> /// <param name="bt"></param> /// <param name="stk"></param> public Girl(BootsDecorator bt, StockingsDecorator stk) { _bt = bt; _stk = stk; } /// <summary> /// 鞋子,丝袜,发夹混搭mix macth /// </summary> /// <param name="bt"></param> /// <param name="stk"></param> /// <param name="hp"></param> public Girl(BootsDecorator bt, StockingsDecorator stk, HairpinDecorator hp) { _bt = bt; _stk = stk; _hp = hp; } /// <summary> /// 丝袜,发夹混搭mix macth /// </summary> /// <param name="stk"></param> /// <param name="hp"></param> public Girl(StockingsDecorator stk, HairpinDecorator hp) { _stk = stk; _hp = hp; } public void show() { string seewhat="我看见一个"; if (_bt != null) { seewhat += _bt.ToString(); } if (_hp != null) { seewhat += _hp.ToString(); } if (_stk != null) { seewhat += _stk.ToString(); } seewhat += "的女孩,口水直流"; Console.WriteLine(seewhat); } }
然后我们实现她。看看女孩长什么样
class Program { static void Main(string[] args) { new Girl(new BootsDecorator("高跟"), new StockingsDecorator("网状", "黑色", "长")).show(); new Girl(new BootsDecorator("高跟"), new StockingsDecorator("网状", "黑色", "长"),new HairpinDecorator("红色")).show(); new Girl(new StockingsDecorator("网状", "黑色", "长"), new HairpinDecorator("红色")).show(); string a = Console.ReadLine(); } }
输出结果
总结
存在一些组件而无法继承它
你希望为他们额外添加行为或者状态,改变该类中某些对象,且没有影响该类其他对象。
而这些行为和状态,你在项目执行时却无法获知。
比较
Decorator 装饰器模式:采用组装整合其他对象来实现,没有使用继承类或者接口实现。
Adapter 适配器模式: 在不同类中通过接口搭接起来。
Composite组合模式:聚集具有接口的对象而无需继承其对象接口。
相关文章推荐
- Java设计模式(9) 装饰器
- 设计模式(十二)-装饰器模式(Decorator Pattern)——装饰边框与被饰物的一致性
- 设计模式——装饰器模式及在jdk中的应用
- 设计模式 —— 装饰器模式(Decorator Pattern)
- 设计模式总结篇系列:装饰器模式(Decorator)
- Head First 设计模式——装饰器(Decorator Pattern)——Python实现
- Kotlin 设计模式-装饰器
- Java设计模式概述之结构型模式(装饰器模式)
- Header First设计模式学习笔记——装饰器模式
- 设计模式之--装饰器模式的硬编码的静态装饰和链化
- Java设计模式(7)—— 装饰器
- 设计模式——装饰器模式
- C#设计模式之10——装饰器模式
- php设计模式——装饰器模式
- 设计模式—装饰器模式
- Java设计模式——装饰器模式、适配器模式、外观模式
- 23种设计模式 第二部分 结构模式(2) 装饰器模式
- 学习设计模式(5)——装饰器模式
- 设计模式-7-装饰器模式
- 设计模式(6)-装饰器(认识程序中的装饰器)