Java设计模式从精通到入门二 装饰器模式
介绍
我尽量用最少的语言解释总结:
Java23种设计模式之一,属于结构型模式,允许向一个现有的对象添加新的功能,不改变其结构。
应用实例:
给英雄联盟种的射手,添加不同的装备。先装备攻速鞋,在装备电刀,最后装备无尽
uml类图如下

主要代码如下
ADC类:
/**
* @ClassName ADC
* @Description 英雄联盟射手
* @Author ouyangkang
* @Date 2018-11-13 08:49
**/
public interface ADC {
/**
* @Author ouyangkang
* @Description ADC 必备好吧 攻击 和赢得胜利
* @Date 8:50 2018/11/13
* @param
* @return void
**/
void attack();
/**
* @Author ouyangkang
* @Description 补刀是一个射手必备的素质
* @Date 8:51 2018/11/13
* @param
* @return void
**/
void repairKnives();
}
VN这个射手类
/**
* @ClassName VN
* @Description 薇恩 em... 最喜欢的射手之一
* @Author ouyangkang
* @Date 2018-11-13 08:53
**/
public class VN implements ADC {
@Override
public void attack() {
System.out.println("vn 发起了攻击。。。");
}
@Override
public void repairKnives() {
System.out.println("vn 开始补刀。。。");
}
}
ADC 装备抽象类
/**
* @ClassName DecorateEquipment
* @Description ADC 的装备 抽象类 也就是抽象装饰
*
* 要实现这个射手的接口,并持有改接口的引用
* @Author ouyangkang
* @Date 2018-11-13 08:56
**/
public abstract class DecorateEquipment implements ADC{
private ADC adc;
public DecorateEquipment(ADC adc){
this.adc = adc;
}
@Override
public void repairKnives(){
this.adc.repairKnives();
}
@Override
public void attack(){
this.adc.attack();
}
}
功速鞋类
/**
* @ClassName SpeedShoe
* @Description 攻速鞋 这件装备
* @Author ouyangkang
* @Date 2018-11-13 09:08
**/
public class SpeedShoe extends DecorateEquipment {
public SpeedShoe(ADC adc) {
super(adc);
}
@Override
public void repairKnives() {
// 装备着攻速鞋进行补刀
equipment();
super.repairKnives();
}
@Override
public void attack() {
// 装备着攻速鞋进行团战 杀人
equipment();
super.attack();
}
/**
* @Author ouyangkang
* @Description 装备
* @Date 9:03 2018/11/13
* @param
* @return void
**/
private void equipment(){
System.out.println("装备攻速鞋 提升攻速");
}
}
电刀类
/**
* @ClassName ElectricKnife
* @Description 电刀这件装备
* @Author ouyangkang
* @Date 2018-11-13 09:02
**/
public class ElectricKnife extends DecorateEquipment {
public ElectricKnife(ADC adc) {
super(adc);
}
@Override
public void repairKnives() {
// 装备着电刀进行补刀
equipment();
super.repairKnives();
}
@Override
public void attack() {
// 装备着电刀进行团战 杀人
equipment();
super.attack();
}
/**
* @Author ouyangkang
* @Description 装备
* @Date 9:03 2018/11/13
* @param
* @return void
**/
private void equipment(){
System.out.println("装备电刀这件武器。。。");
}
}
无尽类
/**
* @ClassName EndLess
* @Description 无尽 这件装备
* @Author ouyangkang
* @Date 2018-11-13 09:22
**/
public class EndLess extends DecorateEquipment {
public EndLess(ADC adc) {
super(adc);
}
@Override
public void repairKnives() {
equipment();
super.repairKnives();
}
@Override
public void attack() {
equipment();
super.attack();
}
private void equipment(){
System.out.println("装备着无尽 提高暴击和攻击力");
}
}
测试类
/**
* @ClassName main
* @Description 创建一个射手 向下传递
* @Author ouyangkang
* @Date 2018-11-13 09:10
**/
public class main {
public static void main(String[] args) {
// 创建一个射手
ADC vn = new VN();
// 第三 装无尽
vn = new EndLess(vn);
// 第二 装电刀
vn = new ElectricKnife(vn);
// 第一 装攻速鞋
vn = new SpeedShoe(vn);
vn.repairKnives();
System.out.println("-----------------------------");
vn.attack();
}
}
测试结果如下:
装备攻速鞋 提升攻速
装备电刀这件武器。。。
装备着无尽 提高暴击和攻击力
vn 开始补刀。。。
-----------------------------
装备攻速鞋 提升攻速
装备电刀这件武器。。。
装备着无尽 提高暴击和攻击力
vn 发起了攻击。。。
总结
注意装饰抽象类需要实现你需要进行装备的对象。并持有改对象的引用。然后测试类种的对象都是向上传递。
Java设计模式从精通到入门二 装饰器模式的更多相关文章
- Java设计模式从精通到入门一 责任链模式
一直都想对设计模式有一个深刻的认识,这样对于阅读源码的时候就不会那么吃力了.于是有了想要记录下设计模式的笔记.打算从自己不怎么熟悉的设计模式开始写,里面穿插着一点自己的想法,希望自己写完后,会又一 ...
- Java设计模式从精通到入门四 工厂方法模式
工厂方法模式 属于23中设计模式中创建型类型. 核心思想:工厂提供创建对象的接口,由子类决定实例化哪一个子类. 来源 设计模式之禅中的例子,女娲造人,通过八卦炉来进行造人,没有烧熟的为白人,烧太熟 ...
- JAVA设计模式详解(三)----------装饰者模式
今天LZ带给大家的是装饰者模式,提起这个设计模式,LZ心里一阵激动,这是LZ学习JAVA以来接触的第一个设计模式,也许也是各位接触的第一个设计模式.记得当初老师在讲IO的时候就提到过它:“是你还有你, ...
- 设计模式入门之装饰器模式Decorator
//装饰模式定义:动态地给一个对象加入一些额外的职责. //就添加功能来说.装饰模式比生成子类更为灵活 //这也提现了面向对象设计中的一条基本原则,即:尽量使用对象组合,而不是对象继承 //Compo ...
- 《精通Python设计模式》学习结构型之装饰器模式
这只是实现了Python的装饰器模式. 其实,python的原生的装饰器的应用比这个要强,要广的. ''' known = {0:0, 1:1} def fibonacci(n): assert(n ...
- 设计模式PHP篇(三)————装饰器模式
简单的用php实现了装饰器模式: <?php /** *简单的装饰器模式 */ class PrintText { protected $decorators = []; public func ...
- Java设计模式从精通到入门五 抽象工厂方法模式
定义 抽象工厂类为创建一组相关和相互依赖的对象提供一组接口,而无需指定一个具体的类. 这里我得把工厂方法模式得定义拿出来做一下比较:定义一个创建对象的接口,由子类决定实例化哪一个类.工厂方法是一个 ...
- Java设计模式从精通到入门三 策略模式
介绍 我尽量用最少的语言解释总结: Java23种设计模式之一,属于行为型模式.一个类的行为或者算法可以在运行时更改,策略对象改变context对象执行算法. 应用实例: 以周瑜赔了夫人又折兵的例 ...
- Java函数接口实现函数组合及装饰器模式
摘要: 通过求解 (sinx)^2 + (cosx)^2 = 1 的若干写法,逐步展示了如何从过程式的写法转变到函数式的写法,并说明了编写"[接受函数参数]并返回[能够接受函数参数的函数]的 ...
随机推荐
- Linux CentOS 服务器搭建与初始化配置图文详解
这几天对服务器兴趣贼为浓厚,在虚拟机上装了一个CentOS7玩了玩,遇到过很多问题,比如网卡驱动设置,不能ping 等等问题,然后掏钱买个ECS搭服务器玩玩,下面就开始谢谢我的心路历程吧. 首先 买服 ...
- session和token
功能是一样的,都是要与浏览器建立连接,获取与客户端对应的用户数据,只不过完成这个功能的实现方式不太一样. 本质上的区别: session的使用方式是客户端cookie里存id,服务端session存用 ...
- cdh部署
supermicro安装环境 本次安装基于无因特网的环境,共安装2个节点(一个master节点,一个data及节点),所用系统为centos7.x,所有安装过程均使用root用户.具体的节点信息如下: ...
- Getting started with machine learning in Python
Getting started with machine learning in Python Machine learning is a field that uses algorithms to ...
- Mean shift
转载:http://blog.csdn.net/google19890102/article/details/51030884 然后引入opencv中的pyrMeanShiftFiltering函数: ...
- android摄像头(camera)之 v4l2的c测试代码【转】
转自:https://blog.csdn.net/ldswfun/article/details/8745577 在移植android hal的过程中,移植的首要任务是要确保驱动完好,camera是属 ...
- 使用Let's Encrypted HPPTS你的网站
1.前言 最近,有同事咨询我,怎么样使用Let's Encrypted部署数字证书,于是,结合自己之前的实践,简单总结下. 2.HTTPS的优势 什么加密,防篡改,防广告植入什么的,这个就不多说了.这 ...
- sklearn聚类模型:基于密度的DBSCAN;基于混合高斯模型的GMM
1 sklearn聚类方法详解 2 对比不同聚类算法在不同数据集上的表现 3 用scikit-learn学习K-Means聚类 4 用scikit-learn学习DBSCAN聚类 (基于密度的聚类) ...
- TestNG测试方法
@Test(enabled = false)有助于禁用此测试用例. 分组测试是TestNG中的一个新的创新功能,使用<groups>标记在testng.xml文件中指定分组. 它可以在&l ...
- 将模型.pb文件在tensorboard中展示结构
本文介绍将训练好的model.pb文件在tensorboard中展示其网络结构. 1. 从pb文件中恢复计算图 import tensorflow as tf model = 'model.pb' # ...