裝飾者模式

設計模式—裝飾者模式

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)使用場景

需要擴展一個類或給類添加附加功能

動態給一個對象添加功能,這些功能可以在動態的撤銷

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章