装饰者模式
来源:互联网 发布:局域网免费聊天软件 编辑:程序博客网 时间:2024/05/16 06:31
装饰者模式:
在不改变原类文件和使用继承的情况下,动态的扩展一个对象的功能,即通过创建一个包装对象,来包裹真实的对象
特点:
1.装饰对象和真实对象有相同的接口,这样,客户端对象就可以以和真实对象相同的方式和装饰对象交互(装饰类与被装饰类有相同的借口或者抽象父类,装饰类与接口之间有一个中间件)
2.真实对象包含一个真实对象的引用。
3.装饰对象接受所有来自客户端的请求,并把这些请求转发给真实的对象
4.装饰对象可以在转发这些请求以前或者以后增加一些附加功能
设计原则:
1.封装变化部分
2.开-闭原则(不去修改被装饰的类,新建一个装饰类,满足新的功能)
3.面向抽象编程,不要面向实现编程,能够起到很好的接口隔离作用
4.优先使用对象组合,而非类继承
使用场合
1.当我们需要为某个现有的对象动态的增加一个新的功能或者职责时
2.当某个对象的职责经常发生变化或者经常需要动态的增加职责。
装饰着模式中的角色
1.被装饰者抽象 ,是一个接口或者抽象类。在装饰着模式中,必然有一个被提取出来最核心,最原始的类(上图componet类)
2.被装饰者具体实现,即程序中已经实现的类,
3.装饰者,一般是一个抽象类(中间件的概念),实现接口或者抽象的方法。里面必然有一个指向component的引用。
4.装饰者实现类,通过调用装饰者中的引用,调用到被装饰者中的相应方法
java sdk 相关设计模式
相关设计模式
1.适配器模式:装饰者模式是在不改变原内容的基础上,动态地增加新的行为;而适配器模式则主要用来填补两个接口之间的差异
2.策略模式:策略模式是以切换运算法则的方式变换功能
demo:
1.被装饰者抽象 IBread
public interface IBread {
// 准备材料
public void prepair();
// 和 面
public void kneadFlour();
// 蒸馒头
public void steamed();
// 加工馒头
public void process();
}
2.被装饰者实现 normalBreadpublic class normalBreadimplements IBread {
@Override
public void prepair() {
System.out.println("准备材料");
// TODO Auto-generated method stub
}
@Override
public void kneadFlour() {
System.out.println("和面");
// TODO Auto-generated method stub
}
@Override
public void steamed() {
System.out.println("蒸馒头了");
// TODO Auto-generated method stub
}
@Override
public void process() {
prepair();
kneadFlour();
steamed();
// TODO Auto-generated method stub
}
}
3.装饰者 AbstractBread,里面包含了被装饰者抽象引用
public class AbstractBreadimplements IBread {
public AbstractBread(IBread iBread) {
super();
this.iBread = iBread;
}
private IBreadiBread;//被装饰对象的引用
@Override
public void prepair() {
this.iBread.prepair();
// TODO Auto-generated method stub
}
@Override
public void kneadFlour() {
this.iBread.kneadFlour();
// TODO Auto-generated method stub
}
@Override
public void steamed() {
this.iBread.steamed();
// TODO Auto-generated method stub
}
@Override
public void process() {
//此处是关键
prepair();
kneadFlour();
steamed();
// this.iBread.process();
// TODO Auto-generated method stub
}
}
4.装饰者 实现(cronBread) 添加玉米素
public class cronBreadextends AbstractBread {
public cronBread(IBread iBread) {
super(iBread);
// TODO Auto-generated constructor stub
}
// 被装饰的方法
public void paint() {
System.out.println("添加柠檬黄着色剂...");
}
@Override
public void kneadFlour() {
paint();// 在和面前添加染色剂
super.kneadFlour();
// TODO Auto-generated method stub
}}
5.装饰者实现(sweetBread) 添加甜蜜素public class sweetBreadextends AbstractBread {
public sweetBread(IBread iBread) {
super(iBread);
// TODO Auto-generated constructor stub
}
public void paint() {
System.out.println("添加甜蜜素");
}
@Override
public void kneadFlour() {
paint();
super.kneadFlour();
// TODO Auto-generated method stub
}
}
6.测试类
IBread normal = new normalBread();
normal=new cronBread(normal);
normal=new sweetBread(normal);
normal.process();
- 装饰者模式(Derector)
- 装饰者模式
- Decorator 装饰者模式
- 装饰者设计模式
- 装饰者模式
- 装饰者模式
- 装饰者模式
- 装饰者模式(Decorator)
- 装饰者模式
- 装饰者模式
- 装饰者模式
- 装饰者模式 DecoratorPattern
- 设计模式 - 装饰者
- 装饰者模式
- 装饰者模式
- 装饰者模式 - 2
- 装饰者模式
- 装饰者模式
- 喷水装置(一)
- 伸展树扩展(splay)过程,代码结合图片讲解
- 清华大学留学班2014年招生--美加英澳名校直通车
- c++中两个类的头文件互相包含编译出错的解决办法
- 常用的OpenCV函数速查
- 装饰者模式
- 二:4.phpmyadmin 安装
- 弹出框
- 清华大学留学班2014年招生--美加英澳名校直通车
- javaEE 使用ServletContext实现服务器端简单定时更新缓存
- 中国移动互联网用户行为统计报告2014H1(完整版)
- [除錯]引動過程的目標傳回例外狀況
- 杭电3732 Ahui Writes Word (多重背包问题)
- (原创)底层最基本的也是用的最多的条件查询方法实现,有点多!(已经更新)