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-马士兵设计模式学习笔记-装饰者模式的更多相关文章

  1. Java-马士兵设计模式学习笔记-责任链模式-FilterChain功能

    一.目标 增加filterchain功能 二.代码 1.Filter.java public interface Filter { public String doFilter(String str) ...

  2. Java-马士兵设计模式学习笔记-责任链模式-处理数据

    一.目标 数据提交前做各种处理 二.代码 1.MsgProcessor.java public class MsgProcessor { private List<Filter> filt ...

  3. Java-马士兵设计模式学习笔记-责任链模式-模拟处理Reques Response

    一.目标 1.用Filter模拟处理Request.Response 2.思路细节技巧: (1)Filter的doFilter方法改为doFilter(Request,Resopnse,FilterC ...

  4. Java-马士兵设计模式学习笔记-总结

    <马士兵设计模式学习>学习了以下模式: 1.装饰者模式(例子:水管工,木工) 2.策略模式(例子:老师用职称比大小.学生用成绩比大小) 3.简单工厂模式(例子:VechileFactory ...

  5. 设计模式学习笔记--备忘录(Mamento)模式

    写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方式,这就是软件模式:每个模式描写叙述了一个在我们程序设计中常常发生的问题,以及该问题的解决方式:当我们碰到模 ...

  6. 设计模式学习心得<装饰器模式 Decorator>

    装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装 ...

  7. 设计模式学习之装饰者模式(Decorator,结构型模式)(16)

    参考地址:http://www.cnblogs.com/zhili/p/DecoratorPattern.html 一.定义:装饰者模式以对客户透明的方式动态地给一个对象附加上更多的责任,装饰者模式相 ...

  8. 学习笔记——装饰器模式Decorator

    装饰器模式,最典型的例子. 工厂新开了流水线,生产了手机外壳,蓝天白云花色.刚准备出厂,客户说还要印奶牛在上面,WTF…… 时间上来不及,成本也不允许销毁了重来,怎么办?弄来一机器A,专门在蓝天白云的 ...

  9. 设计模式学习(三): 装饰者模式 (附C#实现)

    需求 做一个咖啡店的订单系统. 买咖啡时,可以要求加入各种调料,如奶,豆浆,摩卡等.咖啡店会根据调料的不同收取不同的费用.订单系统要考虑这些. 初版设计 然后下面就是所有的咖啡....: cost方法 ...

随机推荐

  1. 20165210 Java第一次实验报告

    20165210 第一次实验报告 实验内容 建立目录运行简单的Java程序 建立自己学号的目录 在上个目录下建立src,bin等目录 Javac,Java的执行在学号目录下 IDEA的调试与设置断点 ...

  2. UVALive 3635 Pie(二分法)

    简单的二分法应用,循环1000次精度就满足要求了. #include<iostream> #include<cstdio> #include<cstdlib> #i ...

  3. BRICH

    一.简介 Brich是典型的基于层次的聚类算法.最大的特点就是适合数据量特别大的数据集,处理速度很快,因为该算法扫描一遍数据集. 该算法是利用了一个树状结构来快速聚类,该结构类似平衡B+树.每一个叶子 ...

  4. redis有序集合的使用

    Redis 有序集合(sorted set) Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过 ...

  5. tableau-创建帕累托图

    参考文献:https://onlinehelp.tableau.com/current/pro/desktop/zh-cn/pareto.html 帕累托图是一种按发生频率排序的特殊直方图.在质量管理 ...

  6. MySQL实战 | 02-MySQL 如何恢复到半个月内任意一秒的状态?

    原文链接:MySQL是如何做到可以恢复到任意一秒状态的? 看到这个题目是不是觉得数据库再也不用担心服务器 crash 了? 那我们需要学习为什么可以这么做?以及如何做? 即为什么可以恢复到任意时间点? ...

  7. 西瓜书概念整理(chapter 1-2)熟悉机器学习术语

    括号表示概念出现的其他页码, 如有兴趣协同整理,请到issue中认领章节 完整版见我的github:ahangchen 觉得还不错的话可以点个star ^_^ 第一章 绪论 Page2: 标记(lab ...

  8. angular track by $index

    这个东西配合删除数组时会出现永远删除uoloadPicArr这个数组的最后一个一项 其用法是主要用在当ng-repeat循环时如果其内部的dom元素有id属性存在 可以避免页面出现相同的id  只是一 ...

  9. BZOJ1370:[Baltic2003]团伙

    浅谈并查集:https://www.cnblogs.com/AKMer/p/10360090.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php? ...

  10. bzoj 3398 [Usaco2009 Feb]Bullcow 牡牛和牝牛——前缀和优化dp / 排列组合

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3398 好简单呀.而且是自己想出来的. dp[ i ]表示最后一个牡牛在 i 的方案数. 当前 ...