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 的若干写法,逐步展示了如何从过程式的写法转变到函数式的写法,并说明了编写"[接受函数参数]并返回[能够接受函数参数的函数]的 ...
随机推荐
- 原 layer父子页面交互
1.访问父页面元素值 2.访问父页面方法 3.如何关闭弹出的子页面窗口 parent.layer.close(index);//关闭弹出的子页面窗口 4.如何从子页面执行刷新父页面操作 [javasc ...
- shiroWeb项目-认证及MD5认证信息在页面显示(十)
realm设置完整认证信息 // realm的认证方法,从数据库查询用户信息 @Override protected AuthenticationInfo doGetAuthenticationInf ...
- 【转】scapy 构造以太网注入帧
1. 描述 使用scapy进行以太网帧的注入,相对于RAW_SOCKET还是比较简单的.在讲述packet注入之前,先了解一下scapy伪造以太网帧的相关知识.下图为以太网帧格式和scapy对应的封装 ...
- NandFlash和iNand
nand 1.nand的单元组织:block与page(大页Nand与小页Nand)(1)Nand的页和以前讲过的块设备(尤其是硬盘)的扇区是类似的.扇区最早在磁盘中是512字节,后来也有些高级硬盘扇 ...
- kindle转换工具-calibre
kindle转换工具 calibre https://calibre-ebook.com/download_windows
- linux 高级字符设备驱动 ioctl操作介绍 例程分析实现【转】
转自:http://my.oschina.net/u/274829/blog/285014 1,ioctl介绍 ioctl控制设备读写数据以及关闭等. 用户空间函数原型:int ioctl(int f ...
- linux系统切换用户
无权限上传文件解决办法 1.当前登录的普通用户:user1/password1 2.切换到管理员(user2)用户: sudo su - user2 输入user2用户的密码:password2 或者 ...
- VC++文件拖放
属性Accept Files 设置True,消息WM_DROPFILES 设置事件OnDropFiles void CNWiReworkDlg::OnDropFiles(HDROP hDropInfo ...
- java FTPClient 上传文件 0kb 问题
解决方法: 1.本地防火墙关闭了2.服务端端防火墙关闭 CentOS 7.0关闭默认防火墙启用iptables防火墙 操作系统环境:CentOS Linux release 7.0.1406(Core ...
- php获取POST数据的三种方法
方法一,$_POST $_POST或$_REQUEST存放的是PHP以key=>value的形式格式化以后的数据. $_POST方式是通过 HTTP POST 方法传递的变量组成的数组,是自动全 ...