博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式—装饰者模式
阅读量:5231 次
发布时间:2019-06-14

本文共 2684 字,大约阅读时间需要 8 分钟。

前言

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

装饰者模式介绍

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

1)实际例子

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

 

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleApplication1{    ///     /// 手机抽象类,即装饰者模式中的抽象组件类    ///     public abstract class Phone    {        public abstract void Print();    }    ///     /// 苹果手机,即装饰着模式中的具体组件类    ///     public class ApplePhone : Phone    {        public override void Print()        {            Console.WriteLine("现在你的手机是苹果牌的手机");        }    }    ///     /// 装饰抽象类,要让装饰完全取代抽象组件,所以必须继承自Photo    /// 其实该类定义成class 还是 abstract class运行上市没有什么区别的,所有的子类都需要重写print方法,所以可以定义成抽象的,    /// 但是又需要调用 _phone.Print();方法,所以print方法只能定义成可重写的    ///     public abstract class Decorator : Phone    {        private Phone _phone;        public Decorator(Phone phone)        {            _phone = phone;        }        public override void Print()        {            if (_phone != null)                _phone.Print();        }    }    ///     /// 贴膜,即具体装饰者    ///     public class Sticker : Decorator    {        public Sticker(Phone phone) : base(phone) { }        public override void Print()        {            base.Print();            AddSticker();        }        public void AddSticker()        {            Console.WriteLine("现在手机可以贴膜了");        }    }    ///     /// 手机挂件    ///     public class Accessories : Decorator    {        public Accessories(Phone phone) : base(phone) { }        public override void Print()        {            base.Print();            AddAccessories();        }        public void AddAccessories()        {            Console.WriteLine("现在手机可以添加挂件了");        }    }}

 

 调用方法:

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

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

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

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

转载于:https://www.cnblogs.com/xishuqingchun/p/5012079.html

你可能感兴趣的文章
再见,2014;您好,2015!
查看>>
Single Number
查看>>
DOM详解
查看>>
Python 变量类型 —— type() 函数和 isinstance() 函数
查看>>
设置MAVEN_OPTS环境变量
查看>>
Open quote is expected for attribute "{1}" associated with an element type "column".
查看>>
lintcode :Coins in Line II 硬币排成线 II
查看>>
Project Euler 86:Cuboid route 长方体路径
查看>>
Attention to encodings
查看>>
Maven 镜像
查看>>
python replace函数不起作用的坑
查看>>
百度音乐爬取文件练习
查看>>
给网站配置免费的HTTS证书
查看>>
android 往sd卡中写入文件
查看>>
DB2数据库常用的函数
查看>>
在Win7下新建库并修改图标
查看>>
mysql主从同步配置和读写分离实现(中间件Amoeba)
查看>>
golang lua使用示例
查看>>
64位win2003/win2008系统IIS6.0/7.5配置PHP的方法
查看>>
5月深度学习班第3课梯度下降法与反向传播
查看>>