作用:装饰器模式,动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator 模式相比生成子类更为灵活。Java I/O 中就应用了这一模式(如FilterInputStream,FilterOutputStream)。
示例-装饰器模式:
示例1(比较直观)
//------------------------------------------接口Work 和类SquarePeg ---------------------------------------------------------------
package decorator_1;
public interface Work
{
public void insert();
}
package decorator_1;
public class SquarePeg implements Work{
public void insert(){
System.out.println("方形桩插入");
}
}
/*
* 接口Work有一个具体实现:插入方形桩或圆形桩,这两个区别对Decorator是
*无所谓.我们以插入方形桩为例
*/
//------------------------------------------Decorator类---------------------------------------------------------------
package decorator_1;
public class Decorator implements Work {
private Work work;
// 在构造器中使用组合new方式,引入Work对象;
public Decorator(Work work) {
this.work = work;
}
public void insert() {
System.out.println("挖坑");
work.insert();
System.out.println("钉木板");
}
}
/*
* 现在有一个应用:需要在桩打入前,挖坑,在打入后,在桩上钉木板
*/
//------------------------------------------测试类---------------------------------------------------------------
package decorator_1;
public class Main {
public static void main(String[] args) {
Work work1 = new SquarePeg();
work1.insert();
System.out.println("--------经过装饰后~----------");
Work work2 = new Decorator(work1);
work2.insert();
}
}
示例2(比较实际)
类一览表;
名称
|
说明
|
Display
|
打印字符串的抽象类
|
StringDisplay
|
只有一行的打印字符串用的类-相当于核心对象
|
Border
|
表示“装饰外框”的抽象类-装饰器抽象类
|
SideBorder
|
在左右外框加上装饰外框的类-装饰器具体类1
|
FullBorder
|
在上下外框加上装饰外框的类-装饰器具体类2
|
Main
|
测试用的类
|
类图查看图片附件:类图-Decorator _1
//------------------------------------------ Display类---------------------------------------------------------------
package decorator_2;
public abstract class Display{
public abstract int getColumns();//取得横向的字数
public abstract int getRows();//取得纵向的行数
public abstract String getRowText(int row);//取得第row个字符串
public final void show(){ //打印所用内容
for (int i = 0; i < getRows(); i++){
System.out.println(getRowText(i));//row==0,设计是从这里开始的~~
}
}
}
//------------------------------------------ StringDisplay类---------------------------------------------------------------
package decorator_2;
public class StringDisplay extends Display{
private String string;
public StringDisplay(String string){
this.string = string;
}
public int getColumns(){
return string.getBytes().length;
}
public int getRows(){
return 1;
}
public String getRowText(int row){
if (row == 0) {
return string;
} else {
return null;
}
}
}
//------------------------------------------ Border类---------------------------------------------------------------
package decorator_2;
public abstract class Border extends Display{
protected Display display; //指定装饰外框里面的“内容”
protected Border(Display display){//在产生对象实例时,以参数内容指定“内容”
this.display = display;
}
}
//------------------------------------------ SideBorder类---------------------------------------------------------------
package decorator_2;
public class SideBorder extends Border{
private char borderChar; //装饰字符
public SideBorder(Display display, char ch){
super(display);//以构造函数指定Display和装饰字符
this.borderChar = ch;
}
public int getColumns() {//字符要加上内容两边的装饰字符
return 1 + display.getColumns() + 1;
}
public int getRows(){ //行数同内容的行数
return display.getRows();
}
public String getRowText(int row){//指定该行的内容,即在内容指定行的两边加上装饰字符
return borderChar + display.getRowText(row) + borderChar;
}
}
//------------------------------------------ FullBorder类---------------------------------------------------------------
package decorator_2;
public class FullBorder extends Border{
public FullBorder(Display display){
super(display);
}
public int getColumns(){ //字数=内容字数+内容两边的装饰字符
return 1 + display.getColumns() + 1;
}
public int getRows(){ //行数=内容行数+上下是装饰字符
return 1 + display.getRows() + 1;
}
public String getRowText(int row){ //指定该行的内容
if (row == 0) {//外框顶端
return "+" + makeLine('-',display.getColumns()) + "+";
} else if (row == display.getRows() + 1) {//外框底端
return "+" + makeLine('-',display.getColumns()) + "+";
}else{//其他部分
return "|" + display.getRowText(row - 1) + "|";
}
}
private String makeLine(char ch, int count){//已字符ch,建立重复count次的连续字符串
StringBuffer buf = new StringBuffer();
for(int i =0; i < count; i++){
buf.append(ch);
}
return buf.toString();
}
}
//------------------------------------------测试类---------------------------------------------------------------
package decorator_2;
public class Main{
public static void main(String[] args){
Display b1 = new StringDisplay("Hello ,world.");//打印“Hello,world”没有任何装饰
b1.show();
Display b2 = new SideBorder(b1, '#');//把装饰符”#“加在b1的两边
b2.show();
Display b3 = new FullBorder(b2); //把b2去不加上装饰外框
b3.show();
// Display b4 =
// new SideBorder(
// new FullBorder(
// new FullBorder(
// new SideBorder(
// new FullBorder(
// new StringDisplay("您好。")
// ),
// '*'
// )
// )
// ),
// '/'
// );
// b4.show();
}
}
解析:
装饰器模式对装饰外框和内容是一视同仁的,就如在程序示例中表示装饰外框的Border类是表示内容的Display的子类,这既是一视同仁,换句话说,Border类(及其子类)具有内容表示内容类Display相同的接口。
装饰器模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消,增加由一些基本功能的排列组合而产生的非常大量的功能。就如我们每个人穿衣服一样,我们个体是不变的核心对象,穿上不同样式的衣服(这就是装饰),就能完成我们想要的视觉效果(所需的对象)。
- 大小: 41.6 KB
- 大小: 32.4 KB
分享到:
相关推荐
c++设计模式-结构型模式-装饰器模式;QT工程;c++简单源码; 装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。
- 装饰器模式(Decorator) - 桥接模式(Bridge) - 组合模式(Composite) - 外观模式(Facade) - 享元模式(Flyweight) - 观察者模式(Observer) - 模板方法模式(Template Method) - 策略模式(Strategy) - 责任链...
“就增加功能来说,Decorator 模式相比生成子类更为灵活” 这句话的含义是,组合比继承更灵活,当可拓展的功能很多时,继承方案会产生大量的子类,而组合可以提
装饰器(Decorator)模式 详细教程,简明易懂,非常清晰的,附带有代码示例。
NULL 博文链接:https://xiangtui.iteye.com/blog/1033790
滥用装饰器模式 安装 如果您有风险,请继续使用此功能。 你是大人 npm install --save react-global-event-decorator 这个是来做什么的? 当您单击DOM中的任意位置时,曾经有一个React组件需要执行操作吗? 它...
demo python使用装饰器(Decorator)的方式实现单例模式 functools.wraps 则可以将原函数对象的指定属性复制给包装函数对象, 默认有 __module__、__name__、__doc__,或者通过参数选择
模式装饰器示例 教学类的模式装饰器示例
您必须实现装饰器模式,以便可以在运行时添加提到的服务。 作为开发服务如何工作的示例,在运行时创建一个用加密和缓存装饰的 JSON 策略,以及一个带有日志记录的 XML 策略。 请记住,您必须提供源代码和详细说明所...
装饰图案 带有单一测试的装饰器模式演示
主要介绍了Python中设计模式之Decorator装饰器模式模式,文中详细地讲解了装饰对象的相关加锁问题,需要的朋友可以参考下
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在...
Laravel应用中的装饰器模式 用 :red_heart: 用于智能清洁编码器 尝试将“装饰器”功能从python语言移植到laravel框架。 :delivery_truck: 安装 : composer require imanghafoori/laravel-decorator 什么是...
装饰器模式( Decorator ) 代理模式( Proxy ) 外观模式( Facade ) 桥接模式( Bridge ) 组合模式( Composite ) 享元模式( Flyweight ) 行为型模式包含了: 策略模式( Strategy ) 模板方法模式( ...
控制访问,装饰器设计的四个名词,装饰器模式与代理模式的区别,
收据装饰器由 Patrick Hickey 在 2014 年为 Towson U 的 OOD 课程创建的装饰器设计模式示例Headers、Coupons 和 Rebates 套餐是独立的,因为我们假设它们每天都从 bestbuy 网站上... 这是我第一次尝试使用装饰器模式。
主要为大家详细介绍了java设计模式之装饰器模式Decorator,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
主要介绍了C#装饰器模式(Decorator Pattern),以一个完整实例形式讲述了C#装饰器模式的实现过程,有助于深入理解C#程序设计思想,需要的朋友可以参考下
主要为大家详细介绍了java实现装饰器模式Decorator Pattern,具有一定的参考价值,感兴趣的小伙伴们可以参考一下