装饰者模式
来源:互联网 发布:java用户登录实现代码 编辑:程序博客网 时间:2024/06/05 12:43
设计模式—装饰者模式
1装饰着模式
思想:类应该支持拓展,不应修改
步骤原理:
1.创建装饰抽象类去继承要拓展类(被修饰类)的基类(如果继承具体的被修饰类就成了普通继承了)
=》让子类传送一个被装饰类对象,调用被修饰类的方法
2.创建具体装饰类 继承抽象装饰类
=》重写基类的方法(将被装饰者类的方法保留),添加自己需要的功能
3.具体调用 首先创建被修饰类的对象,将该对象传给拓展类对象,
前言
在软件开发中,经常对一类对象添加不同的功能,如果使用继承来实现的话就则有定义多个类,比如手机类,子类可能会有stickerphone(贴膜手机类),accessoriesPhone(挂件手机类)等,这会导致很多的子类问题,于是我们可以使用装饰者模式来动态给一个对象添加额外的职责,使用类的任意组合实现额外功能
装饰者模式介绍
装饰者模式以对客户透明的方式动态给一个对象附加上更多的职责,装设在模式相比生成子类可以更灵活的增加功能
1)实际例子
手机和手机配件演示装饰者模式
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(
"现在手机可以添加挂件了"
);
}
}
}
调用方法:
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)使用场景
需要扩展一个类或给类添加附加功能
动态给一个对象添加功能,这些功能可以在动态的撤销
需要添加一些有基本功能的排序组合而产生的非常大量的功能
- 装饰者模式(Derector)
- 装饰者模式
- Decorator 装饰者模式
- 装饰者设计模式
- 装饰者模式
- 装饰者模式
- 装饰者模式
- 装饰者模式(Decorator)
- 装饰者模式
- 装饰者模式
- 装饰者模式
- 装饰者模式 DecoratorPattern
- 设计模式 - 装饰者
- 装饰者模式
- 装饰者模式
- 装饰者模式 - 2
- 装饰者模式
- 装饰者模式
- pandas模块
- 算法练习
- HTTP与HTTPS的区别
- Spark重点难点知识总结(二)
- 常用插件的网络地址
- 装饰者模式
- 剑指offer 4---替换空格
- 伪基站和空中信息拦截
- Java单元测试工具:JUnit4(二)——JUnit使用详解
- Spring Boot 入门
- caffe中feature提取时做的修改
- Android Studio里面的Build.gradle的详细配置
- Node.js事件机制
- Spring中,applicationContext.xml 配置文件在web.xml中的配置详解