简单实例理解装饰者设计模式

1.装饰设计模式:
将一个对象作为参数进行传递,然后对这个对象进行包装 --- 改变其中的方法或者添加一些新的行为 --- 装饰设计模式 --- 装饰者模式 ---Decorate Model
改变一个方法:
     1. 通过继承这个类,然后重写其中的方法
2. 通过对象的传递创建装饰对象,在装饰类中重新提供对应的方法
继承的缺点:
1. 单继承
2. 利用向上造型创建了一个父类对象,可以调用子类中重写方法,不能在使用父类中原来的方法
3. 如果父类对象已经存在,不能使用子类中重写之后的方法
装饰设计模式的缺点:
可能提高代码的冗余度 --- 代理模式来解决
     

简单例子理解装饰者:
1.首先定义接口和方法:
     
//定义接口
public interface anim {
    void eat();
    void sleep();
}

2.定义两个类分别实现接口和方法

//定义第一个类:猫
public class Cat implements anim{
    @Override
    //猫吃鱼
    public void eat(){
        System.out.println("吃的是鱼····");
    }
    //猫睡觉梦老鼠
    @Override
    public void sleep () {
        System.out.println("睡觉的时候梦到老鼠····");
    }
}

//定义第二个类:狗
public class Dog implements anim{
    public void eat(){
        System.out.println("吃肉");
    }
    @Override
    public void sleep () {
        System.out.println("睡觉的时候梦到骨头");
    }
}
//输出类,看结果:
public class Test {
    public static void main(String[] args){
        Dog dog = new Dog();
        Cat cat = new Cat();
        dog.eat();     // 吃肉
        dog.sleep();   // 睡觉的时候梦到骨头
        cat.eat();     // 吃的是鱼····
        cat.sleep();   // 睡觉的时候梦到老鼠····
    }
}

2.分析上面代码:
     猫和狗都实现了eat和sleep方法。但是猫吃的是鱼,梦的是老鼠。狗吃的是肉,梦的是骨头。
     这是最简单的代码,那么怎如果有一个想法
     让结果看起来:猫吃肉,梦到的是骨头。怎么办呢···。
装饰者设计模式:实现上述想法

//定义第一个类:猫
public class Cat implements anim{
     //先在Cat类中定义Dog类。
     private Dog dog;
     
     //定义构造方法
     Cat(Dog dog){
          this.dog=dog;     
     }

    @Override
    //猫吃鱼
    public void eat(){
        dog.eat();   //猫的eat方法,实际调用的是狗的eat方法
    }
    //猫睡觉梦老鼠
    @Override
    public void sleep () {
       dog.sleep();   //猫的sleep方法实际在调用狗的sleep方法
    }
}

//定义第二个类:狗
public class Dog implements anim{
    public void eat(){
        System.out.println("吃肉");
    }
    @Override
    public void sleep () {
        System.out.println("睡觉的时候梦到骨头");
    }
}
//输出类,看结果:
public class Test {
    public static void main(String[] args){
        Dog dog = new Dog();
        Cat cat = new Cat(Dog);
        dog.eat();     //吃肉
        dog.sleep();   //睡觉的时候梦到骨头
        cat.eat();     //吃肉
        cat.sleep();   //睡觉的时候梦到骨头
    }
}

这就是装饰者模式的简单实现,感觉也很容易理解。其中Dog类是被装饰者,Cat类是装饰者(通过cat对象实际调用的是dog的方法)。
装饰者模式的优势:
     看这个简单实例,我们可以深入想像,在Cat中除了实现接口之外还可以定义属于自身的类。
     那么:他既可以调用Dog的实现方法,也可以定义自己的方法例如run( ),getUp( )之类的
     当有类继承Cat的时候,那么它可以扩展更多的方法。继承可以让装饰者的功能越来越多,而且,依然可以调用Dog的方法。
劣势:
     代码可能产生冗余






你可能感兴趣的:(java核心技术)