博客
关于我
设计模式-装饰模式Decorator JAVA示例
阅读量:676 次
发布时间:2019-03-16

本文共 2661 字,大约阅读时间需要 8 分钟。

声明:本博客里面设计模式相关的文章,均是学习 《大话设计模式》 的笔记。

装饰模式Decorator,动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活。下面是装饰模式的结构图:

基本的代码实现:

abstract class Component{

public abstract void operation();

}

class ConcreteComponent : Component{

public override void operation(){

具体对象的操作

}

}

abstract class Decorator : Component{

protected Component mComponent;

public void setComponent(Component component){

mComponent = component;

}

public override void operation(){

if(mComponent !=null){

mComponent.operation();

}

}

}

class ConcreteDecoratorA : Decorator{

private String addedState;本类的独有功能,区别与ConcreteDecoratorB

public override void operation(){

base.operation();

addedState = "New State";

具体装饰对象A的操作

}

}

class ConcreteDecoratorB :Decorator{

public override void operation(){

具体装饰对象B的操作

}

private void addeBehavior(){

}

}

客户端代码:

public static void main(String[] args){

ConcreteComponent mConcreteComponent = new ConcreteComponent();

ConcreteDecoratorA mDecoratorA = new ConcreteDecoratorA();

ConcreteDecoratorB mDecoratorB = new ConcreteDecoratorB();

mDecoratorA .setComponent(mConcreteComponent );

mDecoratorB .setComponent(mDecoratorA );

mDecoratorB .operation();

}

装饰模式是利用setComponent来对对象进行包装的,这样每个装饰对象的实现,就和如何使用这个对象分开了,每个装饰对象只关心自己的功能,不需要关心如何添加到对象链当中。

下面以装饰模式来模拟给人穿衣服的功能的具体代码:

package component.decorator;

public class Person {
private String name=null;
public Person(){
}
public Person(String name){
this.name = name;
}
public void show(){
System.out.println("dress up :"+name);
}
}

服饰类

public class Finery extends Person{

protected Person mPerson =null;
public void decorator(Person person){
this.mPerson = person;
}
@Override
public void show() {
if(mPerson != null){
mPerson.show();
}
}
}

具体服饰类

public class Tshirts extends Finery {

@Override
public void show() {
super.show();
System.out.println("dress Tshirts !");
}
}

public class BigTrouser extends Finery{

@Override
public void show(){
super.show();
System.out.println("dress big trouser!");
}
}

public class DuckHat extends Finery{

@Override
public void show(){
super.show();
System.out.println("dress Duck hat!");
}
}

客户端类

public class DressUpBaby {

public static void main(String[] args){
Person mPerson = new Person("helloBaby");
Tshirts mTshirts = new Tshirts();
BigTrouser mBigtrouser = new BigTrouser();
DuckHat mDuckHat = new DuckHat();
mTshirts.decorator(mPerson);
mBigtrouser.decorator(mTshirts);
mDuckHat.decorator(mBigtrouser);
mDuckHat.show();这里实际上是通过super.show()做的一个递归调用!
}
}

输出结果:

dress up :helloBaby

dress Tshirts !

dress big trouser!
dress Duck hat!

装饰模式使为已有功能动态的添加更多功能的一种方式。它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,客户端代码可以在运行时根据需要有选择的,按顺序的使用装饰功能包装对象。

优点就是把类中的装饰功能从类中搬移出去,这样可以简化原有的类。有效的把类的核心职责和装饰功能区分开了,而且去除了相关类中重复的装饰逻辑。

你可能感兴趣的文章
Mysql学习总结(77)——温故Mysql数据库开发核心原则与规范
查看>>
Mysql学习总结(78)——MySQL各版本差异整理
查看>>
Mysql学习总结(79)——MySQL常用函数总结
查看>>
Mysql学习总结(7)——MySql索引原理与使用大全
查看>>
Mysql学习总结(80)——统计数据库的总记录数和库中各个表的数据量
查看>>
Mysql学习总结(81)——为什么MySQL不推荐使用uuid或者雪花id作为主键?
查看>>
Mysql学习总结(82)——MySQL逻辑删除与数据库唯一性约束如何解决?
查看>>
Mysql学习总结(83)——常用的几种分布式锁:ZK分布式锁、Redis分布式锁、数据库分布式锁、基于JDK的分布式锁方案对比总结
查看>>
Mysql学习总结(84)—— Mysql的主从复制延迟问题总结
查看>>
Mysql学习总结(85)——开发人员最应该明白的数据库设计原则
查看>>
Mysql学习总结(8)——MySql基本查询、连接查询、子查询、正则表达查询讲解
查看>>
Mysql学习总结(9)——MySql视图原理讲解与使用大全
查看>>
Mysql学习笔记 - 在Centos7环境下离线安装Mysql
查看>>
MySQL学习笔记十七:复制特性
查看>>
Mysql学习第一课-mysql的定义及sql语句
查看>>
mysql学号的字符长度_MYSQL--2
查看>>
mysql安全模式: sql_safe_updates
查看>>
mysql安装,卸载,连接
查看>>
MySQL安装之没有配置向导
查看>>
mysql安装出现 conflicts with mysql*的解决办法
查看>>