JAVA测试装饰者模式
package shb.java.demo;
/**
* 测试装饰者模式
* @package :shb.java.demoJava02
* @author shaobn
* @Describe :
* @Time: 2015-9-9 上午12:17:00
*/
public class TestDecrator { /**
* @author shaobn
* @Describe :
* @param args
* @Time : 2015-9-9 上午12:16:49
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
CampusActivity ca = new AdvancedAct(new CampusInnerAct());
ca.play();
CampusActivity ca_2 = new AdvancedAct(new CampusOuterAct());
ca_2.play();
} }
interface CampusActivity{ void play();
}
class CampusInnerAct implements CampusActivity{
public void play(){
System.out.println("和小伙伴去打篮球");
}
}
class CampusOuterAct implements CampusActivity{
public void play(){
System.out.println("和小伙伴去市中心逛街");
}
}
class Campus__ implements CampusActivity{
public void play(){ }
}
class AdvancedAct implements CampusActivity{
private CampusActivity ca;
public AdvancedAct(CampusActivity ca){
this.ca = ca;
}
public void play(){
ca.play();
System.out.println("骑着电动车去打排球,开着汽车去参加唱歌");
} }
package shb.java.demo;
/**
* 测试装饰者模式
* @package :shb.java.demoJava02
* @author shaobn
* @Describe :
* @Time: 2015-9-9 上午12:17:00
*/
public class TestDecrator_2 { /**
* @author shaobn
* @Describe :
* @param args
* @Time : 2015-9-9 上午12:16:49
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
AdCampusInnerAct acia = new AdCampusInnerAct();
acia.play();
AdCampusOuterAct acoa = new AdCampusOuterAct();
acoa.play();
} }
interface CampusActivity{ void play();
}
class CampusInnerAct implements CampusActivity{
public void play(){
System.out.println("和小伙伴去打篮球");
}
}
class AdCampusInnerAct extends CampusInnerAct{
public void play(){
super.play();
System.out.println("骑着电动车和小伙伴去打排球");
}
}
class CampusOuterAct implements CampusActivity{
public void play(){
System.out.println("和小伙伴去市中心逛街");
}
}
class AdCampusOuterAct extends CampusOuterAct{
public void play(){
super.play();
System.out.println("开着汽车出去唱歌");
}
}
class Campus__{
public void play(){ }
}
class AdCampus__ extends Campus__{
public void play(){
//增强功能......
}
}
第一段为使用装饰者模式,第二段为使用继承。
其实我们从两段代码可以看出,我们的目的是想让原有的功能增强,所以才衍生出更加丰富的方法,因此我们自然会想到继承。同时有一个问题也随之出现,当我们使用继承的时候,发现需要增加的类变得很多时,我们都需要重新写一个类去继承父类,从而重写方法。这样会增加很大的负担,而且耦合性很高,不易于程序的扩展。随之而来,装饰者模式到来。我们只需定义一个接口的子类,然后拿到同一个接口的引用,继而去增强属于该接口引用下的子类对象的方法即可。
两段代码比对,比较明显看出优劣。
如有错误,希望大家纠正。
不早了,睡觉了。。。。
2015-09-09
JAVA测试装饰者模式的更多相关文章
- Java设计模式——装饰者模式
JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...
- Java设计模式の装饰者模式
目录 一.问题引入 二.设计原则 三.用装饰者模式解决问题 四.装饰者模式的特点 五.装饰者模式的定义 六.装饰者模式的实现 七.java.io包内的装饰者模式 一.问题引入 咖啡店的类设计: 一个饮 ...
- 从源码角度理解Java设计模式——装饰者模式
一.饰器者模式介绍 装饰者模式定义:在不改变原有对象的基础上附加功能,相比生成子类更灵活. 适用场景:动态的给一个对象添加或者撤销功能. 优点:可以不改变原有对象的情况下动态扩展功能,可以使扩展的多个 ...
- 【设计模式】Java设计模式 - 装饰者模式
Java设计模式 - 装饰者模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自 ...
- JAVA设计模式--装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...
- JAVA 设计模式 装饰者模式
用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式. 结构
- Java IO 装饰者模式
装饰模式(Decorator) 装饰模式又名包装(Wrapper)模式. 装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式通过创建一个包装对象,也就是装饰,来包裹真实的 ...
- Java 实现装饰(Decorator)模式
在Java在.io反映非常多类包下是典型的装饰格局,例如: new BufferedOutputStream(OutputStream out) new BufferedInputStream(Inp ...
- java之装饰器模式
Decorator Pattern(装饰器模式),定义:Attach additional responsibilities to an object dynamically. Decorators ...
随机推荐
- CSS优先级别计算
a.b.c.d,可以以这四种等级为依据确定CSS选择器的优先级: a-----style 行内样式 个数 +1000 b-----id 个数+100 c-----类 个数+10 d-----类型个数 ...
- 20145211 《Java程序设计》第2周学习总结——桃花依旧笑春风
教材学习内容总结 基本类型 整数 short 2字节,int 4字节,long 8字节 字节 byte 1字节 浮点数 float 4字节,double 8字节 字符 char 2字节(包括字母.汉字 ...
- ArcGIS API for Silverlight 地图元素点闪烁,线流动显示的处理方式
原文:ArcGIS API for Silverlight 地图元素点闪烁,线流动显示的处理方式 <Grid x:Name="LayoutRoot" Background=& ...
- EntityFramework执行SQL语句
在EF中执行Sql语句. using (var context = new EFRecipesEntities()) { string sql = @"insert into Chapter ...
- CodeForce727C. Guess the Array---交互题
题目链接:http://codeforces.com/contest/727/problem/C 题意:交互题: printf(“? i j\n”); fflush(stdout); 然后scanf( ...
- JavaScript学习基础部分
JavaScript学习基础 一.简介 1.JavaScript 是因特网上最流行的脚本语言,并且可在所有主要的浏览器中运行,比方说 Internet Explorer. Mozilla.Firefo ...
- angularjs工程流程走不通的原因以及使用angularjs流程注意点
1 入口index.html 在这个页面中要引入一些js,也就是说无论哪个模块下的js以及css都是在index.html下引入的,而在其他非index.html的html页面中,只有div模块代码, ...
- Linux命令行–更多bash shell命令(转)
4.1.1 探查程序 ps 命令 默认情况下,ps命令只会显示运行在当前控制台下的属于当前用户进程的进程 显示的当前进程的项目 进程号 运行在哪个终端(tty) 进程占用的CPU时间 Linux系统支 ...
- eclipse启动tomcat错误:A Java Exception has occurred(转)
在tomcat bin目录下执行startup.bat可以正常启动,但在eclipse下安装了tomcat插件并且配置tomcat路径后启动且报错:A Java Exception has occur ...
- 微信公开课(北京站)速记 微信、微信支付、O2O的定义与关联
本文为4月29日微信公开课(北京站)微信产品部演讲全文速记,讲述了微信官方对微信.微信支付.O2O的定义与关联等问题的看法与观点. 作者:微信产品部 刘涵涛 吴毅 去年夏天有一个全民打飞机的盛况,这实 ...