大话设计模式——装饰模式和代理模式

Posted xiangguoguo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大话设计模式——装饰模式和代理模式相关的知识,希望对你有一定的参考价值。

1、是什么?

装饰模式:动态地给一个对象添加额外的职责。

技术分享图片

 

代理模式:其他对象通过对象A去访问对象B。

技术分享图片

 

2、为什么用?

装饰模式:1、遵循开闭原则,尽量不去修改原有的类。2、装饰对象一般都是添加额外的非核心功能,通过继承来扩展也可以达到目的,不过无法灵活的组合这些新添的功能。

代理模式:假如一个对象A有很多方法,但是对于某些对象只允许访问A中一部分方法,这就需要通过代理对象进行访问,这就是所谓的权限。==

3、怎么用?

装饰模式:

public class task_02_装饰模式 {
    @Test
    public void test() {
        Client client=new Client();
        
        RealPerson person1=new RealPerson("小强");
        client.fun(person1);
        
        BasePerson person2=new Decorator1(person1);
        client.fun(person2);
        
        BasePerson person3=new Decorator2(person1);
        client.fun(person3);
    }
}
class Client{
    public void fun(BasePerson person) {
        person.play();
    }
}
/**
 * 对象接口,对其play方法进行装饰
 * @author xiang20180825
 *
 */
interface BasePerson{
    void play();
}
/**
 * 具体对象
 * @author xiang20180825
 *
 */
class RealPerson implements BasePerson{
    private String name;
    RealPerson(String name){
        this.name=name;
    }
    public void play() {
        System.out.println(name+"打篮球");
    }
}
/**
 * 装饰抽象类
 * @author xiang20180825
 *
 */
abstract class Decorator implements BasePerson{
    BasePerson person;//包装了对象
    Decorator(BasePerson person){
        this.person=person;
    }
    public abstract void play();
}
class Decorator1 extends Decorator{
    Decorator1(BasePerson person){
        super(person);
    }
    public void play() {
        System.out.print("没有穿衣服的");
        person.play();
    }
}
class Decorator2 extends Decorator{
    Decorator2(BasePerson person){
        super(person);
    }
    public void play() {
        System.out.print("穿了衣服的");
        person.play();
    }
}

代理模式:

/*
 * 老板的亲戚来了,让老板给他买个早饭,老板买了。
 * 实际上是让助理买的,老板的亲戚根本都不知道助理的存在,也不可能让助理跳舞。
 * 
 * 这里boss相当于代理类。而assistant是实际的买早点的对象。
 */
public class task_01_代理模式 {
    @Test
    public void test() {
        Assistant assistant=new Assistant();
        Boss boss=new Boss(assistant);
        goShopping(boss);
    }
    public void goShopping(GoShopping goShopping) {
        goShopping.shopping();
    }
}
interface GoShopping{
    void shopping();
}
class Assistant implements GoShopping{
    public void shopping() {
        System.out.println("买个早点");
    }
    public void dancing() {
        System.out.println("跳舞");
    }
}
class Boss implements GoShopping{
    Assistant assistant;
    Boss(Assistant assistant){
        this.assistant=assistant;
    }
    public void shopping() {
        assistant.shopping();
    }
}

区别:(接受批评和指正)

1、侧重点不同:装饰模式强调给对象添加额外的“装饰”,被装饰对象原本的功能正常执行;代理模式强调访问对象的间接性(对实际对象的访问进行控制)。

2、对于调用者来说,装饰模式关注被装饰的对象,效果是被装饰的功能;代理模式关注访问实际对象的代理对象,不必知道实际对象的存在,效果是实际对象的功能。

注:

大话设计模式6.5节中的代码结构图如下:

技术分享图片

个人觉得不妥之处:服饰类继承了人,没有遵循里氏代换原则。

以上是关于大话设计模式——装饰模式和代理模式的主要内容,如果未能解决你的问题,请参考以下文章

大话设计模式-笔记

大话设计模式-笔记

大话设计模式结构型模式总结

大话设计模式之装饰模式(包装模式)

大话设计模式—装饰模式

《大话设计模式》--装饰者模式