装饰者模式(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. 关于SelectObject之后是否要恢复之前的GDI对象

    以下列代码为例 { // 创建内存DC CDC mMemDc; mMemDc.CreateCompatibleDC( &dc ); // 创建兼容位图 CBitmap bmpMemBmp; b ...

  2. 51nod1934:受限制的排列 (分治+组合数)

    对于一个  11 到  nn 的排列  p1,p2,⋯,pnp1,p2,⋯,pn ,我们可以轻松地对于任意的  1≤i≤n1≤i≤n 计算出  (li,ri)(li,ri) ,使得对于任意的  1≤L ...

  3. BZOJ_2216_[Poi2011]Lightning Conductor_决策单调性

    BZOJ_2216_[Poi2011]Lightning Conductor_决策单调性 Description 已知一个长度为n的序列a1,a2,...,an. 对于每个1<=i<=n, ...

  4. vijos1842(火柴排队)

    描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:∑i=1n(ai−bi)2∑i=1n(ai−bi) ...

  5. CS231n 2016 通关 第五、六章 Batch Normalization 作业

    BN层在实际中应用广泛. 上一次总结了使得训练变得简单的方法,比如SGD+momentum RMSProp Adam,BN是另外的方法. cell 1 依旧是初始化设置 cell 2 读取cifar- ...

  6. Linux 无法登陆172.***.***.***的子网

    1. sudo dhclient -r 这条命令重复执行几次 2. dhclient - 3.查看ifconfig

  7. 20个jQuery分页插件和教程

    1.客户端的jQuery 分页插件jPages jPages 是一个客户端的分页插件,但提供很多特性例如自动翻页.键盘和滚动浏览,延迟显示以及完全可定制的导航面板. Read More Demo 2. ...

  8. shell脚本函数与数组

    前言 之前写过一篇关于shell脚本流程控制总结,这次继续写关于shell脚本的问题.本篇文章主要包含shell脚本中的函数以及数组的用法介绍.同时也涵盖了一些字符串处理以及shell脚本比较使用的小 ...

  9. Docker 网络模型之 macvlan 详解,图解,实验完整

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 上一篇文章我们 ...

  10. lightoj 1096【矩阵快速幂(作为以后的模板)】

    基础矩阵快速幂何必看题解 #include <bits/stdc++.h> using namespace std; /* 0 1 2 3 4 5 6 7 0 0 0 */ const i ...