图1 装饰者模式【点击查看图片】

1,一个简单的以人为主体的装饰者模式

被装饰者

public interface Human {//被装饰者
public void wearClothes();
public void walkToWhere();
} //定义被装饰者,被装饰者初始状态有些自己的装饰
class Person implements Human { @Override
public void wearClothes() {
// TODO Auto-generated method stub
System.out.println("穿什么呢。。");
} @Override
public void walkToWhere() {
// TODO Auto-generated method stub
System.out.println("去哪里呢。。");
}
}

装饰者

public abstract class Decorator implements Human {//定义装饰者
private Human human; public Decorator(Human human) {//有参构造
this.human = human;
} @Override
public void wearClothes() {
human.wearClothes();
} @Override
public void walkToWhere() {
human.walkToWhere();
}
} class Decorator_zero extends Decorator { public Decorator_zero(Human human) {
super(human);
} public void goHome() {
System.out.println("进房子。。");
} public void findMap() {
System.out.println("书房找找Map。。");
} @Override
public void wearClothes() {
// TODO Auto-generated method stub
super.wearClothes();
goHome();
} @Override
public void walkToWhere() {
// TODO Auto-generated method stub
super.walkToWhere();
findMap();
}
} class Decorator_first extends Decorator { public Decorator_first(Human human) {
super(human);
} public void goClothespress() {
System.out.println("去衣柜找找看。。");
} public void findPlaceOnMap() {
System.out.println("在Map上找找。。");
} @Override
public void wearClothes() {
// TODO Auto-generated method stub
super.wearClothes();
goClothespress();
} @Override
public void walkToWhere() {
// TODO Auto-generated method stub
super.walkToWhere();
findPlaceOnMap();
}
} class Decorator_two extends Decorator { public Decorator_two(Human human) {
super(human);
} public void findClothes() {
System.out.println("找到一件D&G。。");
} public void findTheTarget() {
System.out.println("在Map上找到神秘花园和城堡。。");
} @Override
public void wearClothes() {
// TODO Auto-generated method stub
super.wearClothes();
findClothes();
} @Override
public void walkToWhere() {
// TODO Auto-generated method stub
super.walkToWhere();
findTheTarget();
}
}

测试验证

public class Client {
public static void main(String[] args) {
Human person = new Person();
Decorator decorator = new Decorator_two(new Decorator_first(new Decorator_zero(person))); decorator.wearClothes();
decorator.walkToWhere();
}
}

2,一个以汉堡添为主体的装饰者模式

被装饰者

public abstract class Humburger {//被装饰者,主体,被修补的物件
protected String name ;
public String getName(){
return name;
}
public abstract double getPrice(); } class ChickenBurger extends Humburger {//被修饰者的原始状态
public ChickenBurger(){
name = "鸡腿堡";
}
@Override
public double getPrice() {
return 10;
}
}

装饰者

public abstract class Condiment extends Humburger {//装饰者【修修补补的材料】
public abstract String getName();
} class Lettuce extends Condiment {
Humburger humburger;
public Lettuce(Humburger humburger){
this.humburger = humburger;
}
@Override
public String getName() {
return humburger.getName()+" 加生菜";
}
@Override
public double getPrice() {
return humburger.getPrice()+1.5;
}
} class Chilli extends Condiment {
Humburger humburger;
public Chilli(Humburger humburger){
this.humburger = humburger;
}
@Override
public String getName() {
return humburger.getName()+" 加辣椒";
}
@Override
public double getPrice() {
return humburger.getPrice(); //辣椒是免费的哦
} }

测试验证

public class Client {
public static void main(String[] args) {
Humburger humburger = new ChickenBurger();//鸡腿堡 价钱:10.0
System.out.println(humburger.getName()+" 价钱:"+humburger.getPrice()); Lettuce lettuce = new Lettuce(humburger);//鸡腿堡 加生菜 价钱:11.5
System.out.println(lettuce.getName()+" 价钱:"+lettuce.getPrice()); Chilli chilli = new Chilli(humburger);//鸡腿堡 加辣椒 价钱:10.0
System.out.println(chilli.getName()+" 价钱:"+chilli.getPrice()); Chilli chilli2 = new Chilli(lettuce);//鸡腿堡 加生菜 加辣椒 价钱:11.5
System.out.println(chilli2.getName()+" 价钱:"+chilli2.getPrice());
} }

参考:https://blog.csdn.net/jason0539/article/details/22713711

Java装饰者模式(思维导图)的更多相关文章

  1. [Java 并发] Java并发编程实践 思维导图 - 第一章 简单介绍

    阅读<Java并发编程实践>一书后整理的思维导图.

  2. [Java 并发] Java并发编程实践 思维导图 - 第二章 线程安全性

    依据<Java并发编程实践>一书整理的思维导图.

  3. [Java 并发] Java并发编程实践 思维导图 - 第四章 对象的组合

    依据<Java并发编程实践>一书整理的思维导图. 第一部分: 第二部分:

  4. 学习Java的9张思维导图

    转自:https://blog.csdn.net/aitaozi11/article/details/79652943 网上搜集了java的学习思维导图,分享给大家. 01.Java程序设计(基础) ...

  5. Java Web学习过程的思维导图

    今天找文件,无意中翻到老师前段时间总结的知识点.觉得应该有点用处,所以分享给大家. 第一次在博客园发表,如有错误,还请指正.

  6. java编程思想-泛型思维导图

  7. java编程思想-并发思维导图

  8. java编程思想-注解思维导图

  9. Java基础知识学习思维导图

  10. 思维导图学《On Java》基础卷

    说明 原来读过 <Java 编程思想(第 4 版)>,但是这个版本还是基于 Java 5 讲解.由于 Java 8 做出了非常大的改进(是 Java 变化最大的版本),且截止到 2022- ...

随机推荐

  1. Linux设备驱动程序 之 中断

    中断 中断使得硬件可以发出通知给处理器,本质上是一种特殊的电信号,由硬件设备发向处理器,处理器接收到中断后,会马上向操作系统反应此信号的到来,然后就由操作系统负责处理这些新来的数据:硬件设备生成中断并 ...

  2. jupyter notebook 安装代码提示功能

    我的是在anaconda中的root环境下运行以下命令,在其他环境下发现没有效果 1 pip install jupyter_contrib_nbextensions jupyter contrib ...

  3. Eclipse项目修改编译jdk版本(Failed to read candidate component class: file 处理)

    转: Failed to read candidate component class: file 处理 2018年03月09日 07:15:54 爱萨萨 阅读数 10041   出错现象: org. ...

  4. Qt osg QWidget osgViewer::Viewer

    osgViewer::Viewer* _viewer = nullptr; _viewer = new osgViewer::Viewer;osg::ref_ptr<osg::Group> ...

  5. rrt tree

    package com.bim.rrt_20190529; import static java.lang.Math.pow;import static java.lang.Math.sqrt; im ...

  6. 阶段5 3.微服务项目【学成在线】_day05 消息中间件RabbitMQ_13.RabbitMQ研究-工作模式-header和rpc工作模式

    header模式 header模式与routing不同的地方在于,header模式取消routingkey,使用header中的 key/value(键值对)匹配 队列. 案例: 根据用户的通知设置去 ...

  7. 阶段5 3.微服务项目【学成在线】_day05 消息中间件RabbitMQ_4.RabbitMQ研究-安装RabbitMQ

    RabbitMQ由Erlang语言开发,Erlang语言用于并发及分布式系统的开发,在电信领域应用广泛,OTP(Open Telecom Platform)作为Erlang语言的一部分,包含了很多基于 ...

  8. Qt编写安防视频监控系统1-通道切换

    一.前言 通道切换在视频监控系统中是最基础的必备功能,一般都会提供1通道+4通道+6通道+8通道+9通道+16通道这几个通道切换,可能做得比较好的还会提供24通道+32通道的,这个可能对电脑的配置就有 ...

  9. linux简单命令3---帮助命令

    1:帮助命令:man 命令: 2:这个帮助用的比较多(还是中文):命令  --help 3:shell帮助 4:详细命令(比man更详细)帮助,用的少,比较麻烦:info

  10. 生产订单BADI实例

    转自:https://blog.csdn.net/wbin9752/article/details/7951390 以生产订单收货为例: 1.BADI的查找方法: SE38在程序中搜索关键字CL_EX ...