java设计模式学习笔记之装饰模式

java设计模式学习笔记之装饰模式

尊重原创,转载请注明出处,原文地址: http://blog.csdn.net/qq137722697

这是一个使用策略模式构建模式设计的网络请求框架,去看看吧《[倾力之作]android轻量级网络请求框架MyHttputils2.1.6

装饰模式(Decorator):动态地为对象添加一些额外的职责(功能),就增加功能来说,装饰模式比生成子类更为灵活。

场景还原

今天穿什么衣服?如何搭配?

两个人:皮特和萨米,他们今天要穿什么衣服呢?

简单点就来说说怎么实现下面的结果吧!

这里写图片描述

简单实现

这还不简单?看我的:

public static void main(String[] args) {
           System.out.println("第一种装扮\n" +
                "皮特-----------装扮开始---------\n" +
                "\t穿T-Short\t\t传西装\n" +
                "\n" +
                "第二种装扮\n" +
                "萨米-----------装扮开始---------\n" +
                "\t穿裙子\t\t穿高跟鞋");
}

哈哈,确实这种是最简单的方式了

既然咋们讲装饰模式 就来点设计模式的方式实现吧

装饰模式的实现

得有个Person类吧?(说来就来)

public class Person {
    private String name;

    public Person() {

    }

    public Person(String name) {
        this.name = name;
    }

    public void show() {
        System.out.println( name+"-----------装扮开始---------");
    }
}

装饰模式需要有一个装饰类的公共父类,这样便于子类动态扩展功能

/**
 * 服装装饰类----所有装饰类的父类
 * Created by HDL on 2016/12/1.
 */
public class FinaryDecotator extends Person {
    private Person person;

    //打扮谁
    public void decoration(Person person) {
        this.person = person;
    }

    @Override
    public void show() {
        if (person != null) {
            person.show();
        }
    }
}

下面就是具体的搭配类

高跟鞋类

/**
 * 高跟鞋
 * Created by HDL on 2016/12/1.
 */
public class HShoseFinaryDecotator extends FinaryDecotator {
    @Override
    public void show() {
        super.show();
        System.out.print("\t穿高跟鞋\t");
    }
}

裙子类

/**
 * 同样是具体的装饰类-----裙子类
 * Created by HDL on 2016/12/1.
 */
public class SkirtFinaryDecotator extends FinaryDecotator {
    @Override
    public void show() {
        super.show();
        System.out.print("\t穿裙子\t");
    }
}

T-Short类

/**
 * 具体的服装修饰类-----T-Short类
 * Created by HDL on 2016/12/1.
 */
public class TShortFinaryDecotator extends FinaryDecotator {
    @Override
    public void show() {
        super.show();
        System.out.print("\t穿T-Short\t");
    }
}

西装类

/**
 * 西装
 * Created by HDL on 2016/12/1.
 */
public class SuitFianry    extends FinaryDecotator {
    @Override
    public void show() {
        super.show();
        System.out.print("\t传西装\t");
    }
}

使用

来看看怎么装饰?

public static void main(String[] args) {
    System.out.println("第一种装扮");
    Person peter = new Person("皮特");
    TShortFinaryDecotator tShort = new TShortFinaryDecotator();//衬衫
    SuitFianry suitFianry = new SuitFianry();//西装
    tShort.decoration(peter);//衬衫来修饰皮特
    suitFianry.decoration(tShort);//西装来修饰衬衫
    suitFianry.show();//穿好了

    System.out.println("\n\n\n\n第二种装扮");
    Person sami = new Person("萨米");
    SkirtFinaryDecotator skirtFinary = new SkirtFinaryDecotator();//裙子
    HShoseFinaryDecotator hShoseFinary = new HShoseFinaryDecotator();//高跟鞋
    skirtFinary.decoration(sami);//萨米先穿裙子(裙子修饰萨米)
    hShoseFinary.decoration(skirtFinary);//再穿上高跟鞋(高跟鞋修饰裙子)
    hShoseFinary.show();//穿好了
}

通过注释你会发现,其实装饰模式就是一个子类修饰另一个子类,具体执行顺序由调用者来决定。

总结

装饰模式是为已有功能动态地添加更多功能的一种方式。

什么时候用呢?

当系统需要新功能的时候,是向旧的类中添加新的业务代码。这些新加的代码通常修饰了原有类的核心职责或主要行为,这就大大增加了原有类的复杂度,装饰模式提供了一个很好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为的时候,客户代码就可以在运行时根据需要有选择地、按顺序地使用包装类对象来装饰。

装饰类有什么优点?

1、把类中的装饰功能从雷总去除,这样可以简化原有的类;

2、有效地把类的核心职责和装饰功能区分开了。而且可以去除相关类中重复的装饰逻辑。

需要注意什么?

从上面的代码也可以看出,装饰的顺序是很重要的。

尊重原创,转载请注明出处,原文地址: http://blog.csdn.net/qq137722697

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值