装饰者模式--Java篇
装饰者模式(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篇的更多相关文章
- 设计模式之装饰者模式-java实例
设计模式之装饰者模式 需求场景 我们有了别人提供的产品,但是别人提供的产品对我们来说还不够完善,我们需要对这个产品的功能进行补强,此时可以考虑使用装饰者模式. 我们已经有了产品,而且这个产品的功能非常 ...
- 装饰者模式——Java设计模式
装饰模式 1.概念 动态地为对象附加上额外的职责 其目的是包装一个对象,从而可以在运行时动态添加新的职责.每个装饰器都可以包装另一个装饰器,这样理论上来说可以对目标对象进行无限次的装饰. 2.装饰器类 ...
- DecoratorPattern(装饰器模式)-----Java/.Net
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装
- 策略模式--Java篇
策略模式(Strategy):它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. 下面将以商场打折为例子,说明策略模式.商场收银如何促销,用打折还是 ...
- 简单工厂模式-Java篇
简单工厂模式就是考虑如何实例化对象的问题,就是说到底要实例化谁,将来会不会增加实例化对象,比如计算器类中增加开根元素,应该考虑用一个单独的类来创造实例的过程,这就是工厂.下面将利用计算器类举例,解释简 ...
- Java设计模式之装饰者模式
要实现装饰者模式,注意一下几点内容: 1.装饰者类要实现真实类同样的接口 2.装饰者类内有一个真实对象的引用(可以通过装饰者类的构造器传入) 3.装饰类对象在主类中接受请求,将请求发送给真实的对象(相 ...
- Decorator模式(装饰器模式)
Decorator模式? 假如现在有一块蛋糕,如果只涂上奶油,其他什么都不加,就是奶油蛋糕.如果加上草莓,就是草莓奶油蛋糕.如果再加上一块黑色巧克力板,上面用白色巧克力写上姓名,然后插上代表年龄的蜡烛 ...
- Java进阶篇设计模式之五-----外观模式和装饰器模式
前言 在上一篇中我们学习了结构型模式的适配器模式和桥接模式.本篇则来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这 ...
- Java中InputStream装饰器模式的大家族
本文写在po主初学JAVA时,在学习inputStream摸不着头脑,受Java IO-InputStream家族 -装饰者模式一文启发,所以在理清思路时写下本文.因为初学,如有错误,望指正. 因为和 ...
随机推荐
- SPOJ:Another Longest Increasing Subsequence Problem(CDQ分治求三维偏序)
Given a sequence of N pairs of integers, find the length of the longest increasing subsequence of it ...
- HihoCoder 1570 : 小Hi与法阵(简单几何)
描述 小Hi喜欢大,而小Ho喜欢小.他们所在的城市(视为二维平面)有N座法阵.现在他们各选三座法阵,以三座法阵为顶点组成三角形,并站在所选三角形的重心位置:二人选择的法阵可以有相同的.小Hi选择面积最 ...
- 多线程之:volatile变量的一次写操作的过程
一:对volatile修饰的变量进行一次写操作的完整过程 在 java 垃圾回收整理一文中,描述了jvm运行时刻内存的分配.其中有一个内存区域是jvm虚拟机栈,每一个线程运行时都有一个线程栈,线程 ...
- C++对C的增强
一.namespace命名空间 1.C++命名空间基本常识所谓namespace,是指标识符的各种可见范围.c++标准程序库中的所有标识符都被定义与一个名为std的namespace中. 1.1:&l ...
- vi编辑器的使用(2)
1.4 光标移动 vi编辑器中的很多命令都是基于光标当前位置的,因此,如何移动光标定位到所需要的位置是一项十分重要的工作,下面进行详细介绍(如无特别说明,下面所讲的命令都是在普通模式下执行). 1. ...
- Ubuntu解压windows下的.zip文件出现乱码的解决办法
乱码类似这样的:╫╩┴╧╖┤╤▌▓т╒╛╦┘╢╚│ 这个主要是因为zip文件对文件名的编码默认为当前环境的locale,如在windows下压缩的zip文件,在linux下其中的中文名便会乱码.这是z ...
- Flutter实战视频-移动电商-33.列表页_子类和商品列表交互效果
33.列表页_子类和商品列表交互效果 主要实现点击小类下面的列表跟着切换 获取右侧下面的列表信息,即要传递大类的id也要传递小类的,所以需要把左侧的大类的id也要Provide化 可以看下网站上的接口 ...
- Wiki 标记语言(Fitnesse)
- 【废弃】JavaScript 删除部分
创建: 2019/02/26 添加: 2019/02/06 添加Object部分 添加: 2019/03/09 添加Function部分 毕竟自己曾经写的,彻底删得不留痕迹还是舍不得的. 但是的确已经 ...
- now code寒假练习赛2——处女座的砝码(找规律题+高精度题)
#include <bits/stdc++.h> #define ll long long using namespace std; int main() { long double n ...