装饰者模式(Decorator):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰者模式比生成子类更为灵活。

  1.定义接口,可以动态的给对象添加职责。

 package com.lujie;

 public interface SuperPerson {
//定义一个接口,可以动态的给对象添加职责
public abstract void show() ;
}

  2.实现这个接口

 package com.lujie;

 public class Person implements SuperPerson{
private String name;
public Person() {
// TODO Auto-generated constructor stub
}
public Person(String name) {
this.name=name;
}
//具体对象的操作
public void show() {
System.out.println("装饰者:"+name);
}
}

  3.装饰类

 package com.lujie;

 public class Finery extends Person{
protected Person component;
//设置component
public void Decorate(Person component) {
this.component=component;
}
//重写show(),实际执行的是component的show()操作
public void show() {
if(component!=null){
component.show();
}
} }

  4.具体实现的装饰类

 package com.lujie;

 public class Shoes extends Finery{
//首先执行本类的功能,再运行原Component的show(),相当于对原Component进行了装饰
public void show() {
System.out.println("皮鞋");
super.show();
}
}
 package com.lujie;

 public class Suit extends Finery{
//首先执行本类的功能,再运行原Component的show(),相当于对原Component进行了装饰
public void show() {
System.out.println("西装");
super.show();
}
}
package com.lujie;
//具体服饰类
public class TShirts extends Finery{
//首先执行本类的功能,再运行原Component的show(),相当于对原Component进行了装饰
public void show() {
System.out.println("大体恤");
super.show();
}
}
 package com.lujie;

 public class WearSneakers extends Finery{
public void show() {
System.out.println("破球鞋");
super.show();
}
}

  5.测试用例:

 package com.lujie;

 public class PersonShowMain {

     public static void main(String[] args) {
// TODO Auto-generated method stub
Person person=new Person("小明");
System.out.println("第一种装扮:");
WearSneakers wSneakers=new WearSneakers();
BigTrouser bigTrouser=new BigTrouser();
TShirts tShirts=new TShirts();
//装饰过程
wSneakers.Decorate(person);
bigTrouser.Decorate(wSneakers);
tShirts.Decorate(bigTrouser);
tShirts.show();
//装饰过程二
System.out.println("第二种装扮:");
Suit suit=new Suit();
wSneakers.Decorate(person);
bigTrouser.Decorate(wSneakers);
suit.Decorate(bigTrouser);
suit.show();
} }

  6.运行结果:

装饰者模式--Java篇的更多相关文章

  1. 设计模式之装饰者模式-java实例

    设计模式之装饰者模式 需求场景 我们有了别人提供的产品,但是别人提供的产品对我们来说还不够完善,我们需要对这个产品的功能进行补强,此时可以考虑使用装饰者模式. 我们已经有了产品,而且这个产品的功能非常 ...

  2. 装饰者模式——Java设计模式

    装饰模式 1.概念 动态地为对象附加上额外的职责 其目的是包装一个对象,从而可以在运行时动态添加新的职责.每个装饰器都可以包装另一个装饰器,这样理论上来说可以对目标对象进行无限次的装饰. 2.装饰器类 ...

  3. DecoratorPattern(装饰器模式)-----Java/.Net

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

  4. 策略模式--Java篇

    策略模式(Strategy):它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. 下面将以商场打折为例子,说明策略模式.商场收银如何促销,用打折还是 ...

  5. 简单工厂模式-Java篇

    简单工厂模式就是考虑如何实例化对象的问题,就是说到底要实例化谁,将来会不会增加实例化对象,比如计算器类中增加开根元素,应该考虑用一个单独的类来创造实例的过程,这就是工厂.下面将利用计算器类举例,解释简 ...

  6. Java设计模式之装饰者模式

    要实现装饰者模式,注意一下几点内容: 1.装饰者类要实现真实类同样的接口 2.装饰者类内有一个真实对象的引用(可以通过装饰者类的构造器传入) 3.装饰类对象在主类中接受请求,将请求发送给真实的对象(相 ...

  7. Decorator模式(装饰器模式)

    Decorator模式? 假如现在有一块蛋糕,如果只涂上奶油,其他什么都不加,就是奶油蛋糕.如果加上草莓,就是草莓奶油蛋糕.如果再加上一块黑色巧克力板,上面用白色巧克力写上姓名,然后插上代表年龄的蜡烛 ...

  8. Java进阶篇设计模式之五-----外观模式和装饰器模式

    前言 在上一篇中我们学习了结构型模式的适配器模式和桥接模式.本篇则来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这 ...

  9. Java中InputStream装饰器模式的大家族

    本文写在po主初学JAVA时,在学习inputStream摸不着头脑,受Java IO-InputStream家族 -装饰者模式一文启发,所以在理清思路时写下本文.因为初学,如有错误,望指正. 因为和 ...

随机推荐

  1. 洛谷 1541 乌龟棋——dp

    题目:https://www.luogu.org/problemnew/show/P1541 以用了几张牌为阶段.注意知道了用了4种牌各几张后,当前位置就是确定的,所以不用记录什么的. #includ ...

  2. Azure REST API (5) 中国Azure EA Portal Billing API

    <Windows Azure Platform 系列文章目录> 本文介绍的是国内由世纪互联运维的Azure China. EA Portal的管理url是:https://ea.azure ...

  3. Module:template

    ylbtech-Module: 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   作者:ylbtech出处:http://ylbtech. ...

  4. bzoj3832

    拓扑排序+set 如果我们直接记录所有路径是不行的,那么我们要降低路径的数量,于是我们把最短路径转换到边上,这样我们就只有m条路径了. 先计算出f[i]和g[i]表示正反拓扑最长链,把所有g插到set ...

  5. SSM三大框架整合详细教程(Spring+SpringMVC+MyBatis)(转载)

    使用SSM(Spring.SpringMVC和Mybatis)已经有三个多月了,项目在技术上已经没有什么难点了,基于现有的技术就可以实现想要的功能,当然肯定有很多可以改进的地方.之前没有记录SSM整合 ...

  6. opencv MatExpr MatOp

    opencv提供了很多Mat的操作,其中涉及到两个重要的类:MatOp和MatExpr C++: MatExpr abs(const Mat& m) C++: void absdiff(Inp ...

  7. Python死锁与递归锁

    Lock() 互斥锁会导致死锁,用RLock()递归锁代替. 递归锁:可以连续acquire多次,每acquire一次计数器+1(无论acquire的是哪个锁),只有计数为0才能被acquire mu ...

  8. Numpy学习笔记<1>

    1 numpy的ndarray:一种多维数组 a:创建ndarry   注意:np.array会尝试为新建的数组一个合适的数据类型 保存在dtype中 b:嵌套序列转换为一个多维数组 c:输出数据类型 ...

  9. Weekly Contest 78-------->809. Expressive Words (stack)

    Sometimes people repeat letters to represent extra feeling, such as "hello" -> "he ...

  10. POJ3450【KMP理解】

    题意: 求多个字符串的最长公共子串 思路: 4000个串,200长度. 一种暴力,对于一个串最多有200*200=40000级别个子串,然后我要再处理一下next数组200,8e6复杂度: 然后我要和 ...