装饰者模式--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家族 -装饰者模式一文启发,所以在理清思路时写下本文.因为初学,如有错误,望指正. 因为和 ...
随机推荐
- bzoj4247挂饰——DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4247 就是01背包: 把挂钩数限制在n以内,因为不需要更多,而这会带来一些问题,就是有很多挂 ...
- Bean的不同配置方式比较与应用场景
基于XML配置 Bean的定义: 在XML文件中通过<bean>元素定义. Bean的名称: 通过<bean>的id或name属性定义. ...
- Ipython使用总结1
安装了Anaconda就会发现安装了很多组件.也就省去了安装包时候的依赖问题 https://www.continuum.io/downloads 2 Ipython基础 (1)启动: win+R 启 ...
- ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 26. 缓存
In-Memory 使用IMemeryCache接口 注册缓存 HomeController注入进来 建一个类,用来存缓存的常量 判断缓存里面是否有数据,如果没有就读数据库存起来. 设置缓存事件,可调 ...
- python 内置函数的补充 isinstance,issubclass, hasattr ,getattr, setattr, delattr,str,del 用法,以及元类
isinstance 是 python中的内置函数 , isinstance()用来判断一个函数是不是一个类型 issubclass 是python 中的内置函数, 用来一个类A是不是另外一个 ...
- js页面的全屏展示和退出全屏显示
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD ...
- C#项目中一些文件类型说明
designer.cs 是窗体设计器生成的代码文件,作用是对窗体上的控件做初始化工作 (在函数InitializeComponent()中)VS2003以前都把这部分代码放到窗体的cs文件中,由于这 ...
- 割点(Tarjan算法)
本文可转载,转载请注明出处:www.cnblogs.com/collectionne/p/6847240.html .本文未完,如果不在博客园(cnblogs)发现此文章,请访问以上链接查看最新文章. ...
- Git之通过ssh clone代码
1.git平台:码云 2.服务器系统:Linux 1.在Linux中创建ssh公钥,将创建的公钥添加到码云的ssh公钥管理 2.一般来说我们配置完站点之后,都会生成一个站点对应的文件夹,进入文件夹,然 ...
- SPOJ130 【DP·背包选取特性】
题意: 给你n个任务,每个任务有一个起始时间,持续时间,一个权值: 问你怎么分配得到最大值 思路: 数据好大..百度了一发意识到自己好菜啊!背包的特性. dp[i]代表前 i 个能构成的最大值. 对于 ...