Java 装饰模式(4.4)
装饰模式(decorator pattern)。
依照Num模型。讨论职业/IProfession类层次。
IProfession定义了方法say(String),事实上现类教师/ Teacher、医生、律师……依照其职业习惯给出say(String)的实现,这些实现类相当于Num模型中的Zero。
而才艺/Talent类层次(相当于NextOne),能够装饰基本对象,say(String)实现中,在必要的时候会说english、在必要的时候会唱几句……
package closure.decorator;
public interface IProfession {
abstract public void say(String s);
} package closure.decorator;
import static yqj2065.util.Print.pln;
public class Teacher implements IProfession{
@Override public void say(String s){ pln(teach(s)) ; }
public String teach(String s){
String myStyle="解说["+s+"]";
return myStyle;
}
} package closure.decorator;
public abstract class Talent implements IProfession {
protected IProfession base;
public Talent(IProfession base) { this.base = base; }
}
package closure.decorator;
public class TSong extends Talent{
public TSong(IProfession base) {
super(base);
}
@Override public void say(String s){
s = this.song(s);
base.say(s); //
}
public String song(String s){
String strengthen="旋律("+s+")";
return strengthen;
}
}// TEnglish略
1.模板方法
抽象装饰类型Talent,只定义了其类层次的结构——作为类型闭包。没有提供say(String s)的默认实现,由于提供例如以下默认实现
@Override public final void say(String s) {
base.say(s);
}
尽管暗示其子类型应该调用base.say(),但不具有强制性。
Talent能够编写模板方法,使得详细装饰类不再须要改写say()并调用base.say(),而只关注编写增强say()功能的代码。
package closure.decorator;
public abstract class Talent implements IProfession {
protected IProfession base;
public Talent(IProfession base) { this.base = base; }
@Override public final void say(String s) { //模板方法
s = strengthen(s);
base.say(s);
}
public abstract String strengthen(String s);
}
package closure.decorator;
public class TEnglish extends Talent {
public TEnglish(IProfession base) { super(base); }
public String english(String s) {
String strengthen ="E文(" + s + ")";
return strengthen;
}
@Override public String strengthen(String s) { return this.english(s); }
}
//Test
IProfession p = (IProfession) God.create("Profession-decorator");//
p.say("类层次");
p = new TEnglish(new TSong(new TEnglish(p)));
p.say("LSP");
p = new TSong(p);
p.say("继承");
p= p.removeSong();
p.say("继承");
測试代码的输出为:
解说[类层次]
解说[E文(旋律(E文(LSP)))]
解说[E文(旋律(E文(旋律(继承))))]
装饰模式比較典型的标志:Person b = new T2(newT2(newT1(newLawyer())));
2.装饰模式与桥接模式
装饰模式与桥接模式非常相似。桥接模式将2次以上的策略选择逐一地串接起来。如例程3-5中定义的模板方法。
public default void lecture(String s) {
String myStyle = say(s);
next.say(myStyle);
}
桥接模式所串接的,是两种不同的类层次。而装饰模式则将Talent和它的父类型IProfession进行逐一的串接。
能够说,装饰模式是桥接模式的特例。
Java 装饰模式(4.4)的更多相关文章
- java装饰模式
在java的IO中就是运用装饰模式设计的.一层装饰一层 如:DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(n ...
- Java 装饰模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述装饰(Decorator)模式的: 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替 ...
- Java 装饰模式 (Decorator)
装饰模式 动态的将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的取代方案 代码 package gx.component; /** * 组件:装饰类和被装饰类 都要继承:为了类型保持一致 ...
- (私人收藏)[开发必备]最全Java离线快速查找手册(可查询可学习,带实例)
(私人收藏)[开发必备]最全Java离线快速查找手册(可查询可学习,带实例) https://pan.baidu.com/s/1L54VuFwCdKVnQGVc8vD1TQnwmj java手册 Ja ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- 装饰模式,制作一个蛋糕java
import java.text.DecimalFormat; //抽象组件组件 interface mkcake { public void cake(); } class Cake impleme ...
- Java设计模式(学习整理)----装饰模式
1.概念: (在我看来,模式就像是是一种思想,在这种思想的指引下,对代码和结构的一番加工和整合而已!都是套路!) 装饰模式又称包装(Wrapper)模式,是以对客户端透明的方式扩展对象的功能,是继承关 ...
- Java设计模式---装饰模式
装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式的结构 装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任.换言之,客户 ...
- java模式之装饰模式
1. 什么叫装饰模式? 根据业务的需求,需要对一个类的方法进行增强的处理. 2. 为什么需要装饰模式? 拓展性更加的好,当觉得这个装饰不好的时候,可以直接拿下,不需要改变任何的代码. 3. 装饰模式的 ...
随机推荐
- PHP与Web页面的交互
1.form表单默认情况下提交数据的方式为get方式. 2.PHP脚本用来处理表单数据的预定义变量是$_GET,$_POST(区分大小写) 代码示例:(特别注意复选框属性name的时候加数组) sim ...
- What happens when a SQL Query runs?
Posted by Padma Chitturi in Uncategorized. Leave a Comment Hi Folks, It has been such a long time th ...
- SAP MM 模块常用的数据表
SAP MM模块常用数据表: Table Table Class Application Class Data Class Description EBAN TRANSP ME Transactio ...
- DSSM 深度学习解决 NLP 问题:语义相似度计算
https://cloud.tencent.com/developer/article/1005600
- SQL盲注攻击的简单介绍
1 简介 1.1 普通SQL注入技术概述 目前没有对SQL注入技术的标准定义,微软中国技术中心从2个方面进行了描述[1]: (1) 脚本注入式的攻击 (2) 恶意用户输 ...
- 纯CSS实现文字一行居中,多行左对齐的方法
其实这种需求还是蛮常见的,主要用于产品列表页面,用于产品图片下面,显示产品的名称. 想要实现的效果为: 未知文字长度,当文字长度小于盒子宽度,也就是一行时,文字居中. 当文字长度大于盒子的宽度,会自动 ...
- 关于configure和Makefile
http://blog.csdn.net/lltaoyy/article/details/7615833 转篇文章,讲的不是很清楚,再附上几个资料连接,来自http://www.linuxdw.com ...
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-点击激活配置进入到运行模式直接死机或蓝屏怎么办
下载我提供的TCRtime.sys文件,替换掉TwinCAT/Driver目录下的原有文件(原有文件要小一点,这个是159KB的) 如果你同时也安装了TwinCAT3,请不要替换这个,他是398KB的 ...
- [读后感]Java 控制台执行 Jar 传參的编码问题
下面这版面,太让我纠结了.谁能帮调整一下,... _________________ java -jar test.jar "一二一" 这样传进去的 "一二一" ...
- java编写Loadrunner脚本
web.set_max_html_param_len("1000000"); lr.start_transaction("red_envelop"); web. ...