装饰者模式

设计模式—装饰者模式

1装饰着模式


思想:类应该支持拓展,不应修改


步骤原理:


1.创建装饰抽象类去继承要拓展类(被修饰类)的基类(如果继承具体的被修饰类就成了普通继承了)


=》让子类传送一个被装饰类对象,调用被修饰类的方法


2.创建具体装饰类 继承抽象装饰类

=》重写基类的方法(将被装饰者类的方法保留),添加自己需要的功能


3.具体调用 首先创建被修饰类的对象,将该对象传给拓展类对象,




前言

在软件开发中,经常对一类对象添加不同的功能,如果使用继承来实现的话就则有定义多个类,比如手机类,子类可能会有stickerphone(贴膜手机类),accessoriesPhone(挂件手机类)等,这会导致很多的子类问题,于是我们可以使用装饰者模式来动态给一个对象添加额外的职责,使用类的任意组合实现额外功能

装饰者模式介绍

装饰者模式以对客户透明的方式动态给一个对象附加上更多的职责,装设在模式相比生成子类可以更灵活的增加功能

1)实际例子

手机和手机配件演示装饰者模式

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;
using  System.Threading.Tasks;
 
namespace  ConsoleApplication1
{
     /// <summary>
     /// 手机抽象类,即装饰者模式中的抽象组件类
     /// </summary>
     public  abstract  class  Phone
     {
         public  abstract  void  Print();
     }
 
     /// <summary>
     /// 苹果手机,即装饰着模式中的具体组件类
     /// </summary>
     public  class  ApplePhone : Phone
     {
         public  override  void  Print()
         {
             Console.WriteLine( "现在你的手机是苹果牌的手机" );
         }
     }
 
     /// <summary>
     /// 装饰抽象类,要让装饰完全取代抽象组件,所以必须继承自Photo
     /// 其实该类定义成class 还是 abstract class运行上市没有什么区别的,所有的子类都需要重写print方法,所以可以定义成抽象的,
     /// 但是又需要调用 _phone.Print();方法,所以print方法只能定义成可重写的
     /// </summary>
     public  abstract  class  Decorator : Phone
     {
         private  Phone _phone;
         public  Decorator(Phone phone)
         {
             _phone = phone;
         }
         public  override  void  Print()
         {
             if  (_phone !=  null )
                 _phone.Print();
         }
     }
 
     /// <summary>
     /// 贴膜,即具体装饰者
     /// </summary>
     public  class  Sticker : Decorator
     {
         public  Sticker(Phone phone) :  base (phone) { }
 
         public  override  void  Print()
         {
             base .Print();
             AddSticker();
         }
 
         public  void  AddSticker()
         {
             Console.WriteLine( "现在手机可以贴膜了" );
         }
     }
 
     /// <summary>
     /// 手机挂件
     /// </summary>
     public  class  Accessories : Decorator
     {
         public  Accessories(Phone phone) :  base (phone) { }
 
         public  override  void  Print()
         {
             base .Print();
             AddAccessories();
         }
 
         public  void  AddAccessories()
         {
             Console.WriteLine( "现在手机可以添加挂件了" );
         }
     }
}

 

 调用方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
static  void  Main( string [] args)
        {
            Phone apple =  new  ApplePhone();
 
            Decorator sticker =  new  Sticker(apple);
            sticker.Print();
 
            Decorator accessoried =  new  Accessories(apple);
            accessoried.Print();
 
            Decorator stickerAccessoried =  new  Accessories(sticker);
            stickerAccessoried.Print();
        }

 运行结果:

从上面代码看客户端可以直接把手机配件添加到手机上,如果需要添加手机外壳,只需要继承decorator的手机外壳类就好

 

2)装饰者模式介绍

 

抽象构件角色(phone):给出一个抽象接口,以规范准备接受附件责任的对象

具体构件角色(applephone):定义一个将要接受附件责任的类

装饰角色(dicorator):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口

具体装饰角色(sticker,accessories):负责给构件对象添加附加的责任

3)装饰者模式分析

优点:装饰者模式和继承的目的都是对象的扩展,装饰者模式比继承更灵活

         通过不同的具体装饰以及这些类的组合,可以创建出许多不同行为的组合

         具有很好的扩展性

缺点:导致出现许多小对象,过度使用使程序更复杂

4)使用场景

需要扩展一个类或给类添加附加功能

动态给一个对象添加功能,这些功能可以在动态的撤销

需要添加一些有基本功能的排序组合而产生的非常大量的功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值