Java-马士兵设计模式学习笔记-装饰者模式
Java装饰者模式简介
一、假设有一个Worker接口,它有一个doSomething方法,Plumber和Carpenter都实现了Worker接口,代码及关系如下:

1.Worker.java
package decorator; public interface Worker {
public void doSomething();
}
2.Plumber.java
public class Plumber implements Worker {
    @Override
    public void doSomething() {
        System.out.println("修理水管");
    }
}
3.Carpenter
public class Carpenter implements Worker{
    public void doSomething(){
        System.out.println("修门窗");
    }
}
4.测试代码 Test.java
public class Test {
    public static void main(String[] args) {
        Worker worker = null;
        Carpenter carpenter = new Carpenter();
        Plumber plumber = new Plumber();
        worker = carpenter;
        worker.doSomething();
        worker = plumber;
        worker.doSomething();
    }
}
测试结果如下:

二、现有A、B两家公司,都有木工(Carpenter)和水管工(Plumber),但两公司的对两个工种的要求都不同,A公司要求员工在doSomething前自己介绍“我是A公司的”;B公司要求员工在doSomething前自己介绍“我是B公司的”;一个直接但不科学的设计方法是为每个公司都设计各自的木工(Carpenter)和水管工(Plumber),若公司增加到100个,则类要增加到200个,若再增加其他工种,则类会更多,关系如下:

三、此情况适合采用装饰者模式,为每个公司设计一个装饰类xWorker,xWorker也实现Worker接口,且有一个参数类型为Worker的构造函数和一个类型为Worker的成员变量,这样xWorker就可以取得相应类型worker的引用,在xWorker的doSomething()方法里处理各自公司的特殊要求:

 增加类 AWorker.java
 public class AWorker implements Worker {
     private Worker worker;
     //通过些构造函数,AWorker就可以得到具体工种的引用,
     //为下面的doSomething()方法中加入A公司的特殊要求做准备
     public AWorker(Worker worker){
         this.worker = worker;
     }
     @Override
     public void doSomething() {
         System.out.println("您好!我是A公司的员工");
         worker.doSomething();
     }
 }
 //增加类 BWorker.java
 public class BWorker implements Worker {
     private Worker worker;
     public BWorker(Worker worker){
         this.worker = worker;
     }
     @Override
     public void doSomething() {
         System.out.println("您好!我是B公司的员工。");
         worker.doSomething();
     }
 }
 //测试代码
 public static void main(String[] args) {
         //A公司
         Carpenter carpenterA = new Carpenter();
         Plumber plumberA = new Plumber();
         AWorker aWorker1 = new AWorker(carpenterA);
         AWorker aWorker2 = new AWorker(plumberA);
         aWorker1.doSomething();
         aWorker2.doSomething();
         System.out.println("==================================");
         //B公司
         Carpenter carpenterB = new Carpenter();
         Plumber plumberB = new Plumber();
         BWorker bWorker1 = new BWorker(carpenterB);
         BWorker bWorker2 = new BWorker(plumberB);
         bWorker1.doSomething();
         bWorker2.doSomething();
     }
 }
测试结果:

Java-马士兵设计模式学习笔记-装饰者模式的更多相关文章
- Java-马士兵设计模式学习笔记-责任链模式-FilterChain功能
		
一.目标 增加filterchain功能 二.代码 1.Filter.java public interface Filter { public String doFilter(String str) ...
 - Java-马士兵设计模式学习笔记-责任链模式-处理数据
		
一.目标 数据提交前做各种处理 二.代码 1.MsgProcessor.java public class MsgProcessor { private List<Filter> filt ...
 - Java-马士兵设计模式学习笔记-责任链模式-模拟处理Reques Response
		
一.目标 1.用Filter模拟处理Request.Response 2.思路细节技巧: (1)Filter的doFilter方法改为doFilter(Request,Resopnse,FilterC ...
 - Java-马士兵设计模式学习笔记-总结
		
<马士兵设计模式学习>学习了以下模式: 1.装饰者模式(例子:水管工,木工) 2.策略模式(例子:老师用职称比大小.学生用成绩比大小) 3.简单工厂模式(例子:VechileFactory ...
 - 设计模式学习笔记--备忘录(Mamento)模式
		
写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方式,这就是软件模式:每个模式描写叙述了一个在我们程序设计中常常发生的问题,以及该问题的解决方式:当我们碰到模 ...
 - 设计模式学习心得<装饰器模式 Decorator>
		
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装 ...
 - 设计模式学习之装饰者模式(Decorator,结构型模式)(16)
		
参考地址:http://www.cnblogs.com/zhili/p/DecoratorPattern.html 一.定义:装饰者模式以对客户透明的方式动态地给一个对象附加上更多的责任,装饰者模式相 ...
 - 学习笔记——装饰器模式Decorator
		
装饰器模式,最典型的例子. 工厂新开了流水线,生产了手机外壳,蓝天白云花色.刚准备出厂,客户说还要印奶牛在上面,WTF…… 时间上来不及,成本也不允许销毁了重来,怎么办?弄来一机器A,专门在蓝天白云的 ...
 - 设计模式学习(三): 装饰者模式 (附C#实现)
		
需求 做一个咖啡店的订单系统. 买咖啡时,可以要求加入各种调料,如奶,豆浆,摩卡等.咖啡店会根据调料的不同收取不同的费用.订单系统要考虑这些. 初版设计 然后下面就是所有的咖啡....: cost方法 ...
 
随机推荐
- .NET MVC 异步提交和返回参数
			
一.后台页面中的接收方法和返回写法 Jsonresult意味着返回值是json格式,也可以是string或者int等其他类型. Httppost代表只接受Post方法. Mvc中返回Jsonresul ...
 - [BZOJ5248][多省联测2018]双木棋chess
			
bzoj luogu sol 首先,要保证一个格子的左边和上方都放满了棋子,就需要这个点的左上方那个矩形都放满了棋子. 这样放棋子状态就会是一个自左下至右上的轮廓线. 状态数?\(C_{20}^{10 ...
 - 关于讯飞语音SDK开发学习
			
前奏,浑浑噩噩已经工作一年多,这一年多收获还是挺多的.逛园子应该有两年多了,工作后基本上是天天都会来园子逛逛,园子 里还是有很多牛人写了一些不错的博客,帮我解决很多问题.但是一直没写过博客,归根到底一 ...
 - 预备架构的工具ADMEMS矩阵
			
矩阵,是很多著名方法的核心.例如,制定公司层战略的方法之一是"波士顿矩阵","波士顿矩阵"又称"市场增长率-相对市场份额矩阵". " ...
 - xftp连接不上阿里云服务器
			
打开xftp默认是使用FTP协议,要连接到云服务器,需要将协议改为SFTP 连接成功
 - 根据VM的TAG开停机
			
公有云一个非常大的优势,就是可以根据需求进行开停机.由于计费是按时进行的,从而实现节省成本. Azure上用脚本按时开停机已经有很多部署的案例.本文将介绍采用VM Tag中规定的时间进行开停机的脚本. ...
 - Disconf —— 来自百度的分布式配置管理平台
			
摘要 为了更好的解决分布式环境下多台服务实例的配置统一管理问题,本文提出了一套完整的分布式配置管理解决方案(简称为disconf[4],下同).首先,实现了同构系统的配置发布统一化,提供了配置服务se ...
 - npm、nvm、nrm
			
随着前端技术的不断更新和发展,nodejs也越来越流行,作为一个web developer,要安装的依赖包.工具库也越来越多,所以npm几乎是所有前端开发者所必须要用到的,我在工作中曾经遇到过这样的问 ...
 - UE4模型导入基础教程
			
转自:http://www.unrealchina.net/portal.php?mod=view&aid=290
 - FFmpeg结构体:AVInputFormat
			
1.描述 AVInputFormat 是类似COM 接口的数据结构,表示输入文件容器格式,着重于功能函数,一种文件容器格式对应一个AVInputFormat 结构,在程序运行时有多个实例,位于avof ...