装饰者模式详解

出于对设计模式的学习复习,才决定写的这一系列文章,一方面是帮助自己更快的复习记忆,另一方面是帮助有需要的人快速入门,分享自己的学习内容吧。

 

装饰者模式详解_第1张图片

图片来源网络 

 

概念和目的

设计模式是众多经验丰富的工程师经过大量的实验花费了很多很多时间才总结出来的,可以说是众多经验的结晶了。在所有的中、大型项目中,设计模式随处可见。使用设计模式,是为了提高代码的可重用性、可读性以及可靠性。适当的使用设计模式可以为日后扩展节省不少工作量,尽可能避免未知bug,提升项目性能。

 

设计原则

理所当然的,所有的设计模式首先都应该需要遵从的必须是程序开发的六大原则了。如果你对六大原则还不理解,可以看看这篇文章帮你快速了解:最通俗易懂的java 六大原则--代码解析。

 

分类

设计模式有20余种,可分为:

装饰者模式详解_第2张图片

 装饰者模式

下面将讲解桥接器模式,分为:

1、概念解析

2、代码讲解

3、核心思想

4、优缺点

 

概念解析

对现有对象增加新的功能,同时不改变原对象内部结构。装饰者模式符合开放封闭原则,在不改变原对象代码的情况下,增加新的功能需求。装饰者模式一定程度解决了子类爆炸的问题,当然,使用装饰者模式处理的,也能用子类处理问题。但是装饰者模式比继承更加灵活,更易于修改。

来张图感受一下

装饰者模式详解_第3张图片

 

首先创建一个普通人的接口,并创建NorPerson实体类实现人的接口。那现在

代码讲解

/**
 * create time on  2019/6/16
 * function: 普通人
 */
public class NorPerson implements Person{
    private String TAG = "chenhua";
    @Override
    public void run() {
        Log.i(TAG, "run:norPerson ");
    }

    @Override
    public void eat() {
        Log.i(TAG, "eat: norPerson");
    }

    @Override
    public void think() {
        Log.i(TAG, "think:norPerson");
    }
}
/**
 * create time on  2019/6/16
 * function: 人接口
 */
public interface Person {

    void run();
    void eat();
    void think();
}
/**
 * create time on  2019/6/16
 * function:  装饰者抽象类
 */
public  abstract class PersonFly implements Person,Ifly {

    private static final String TAG ="chenhua" ;

    //装饰者抽象类内部含有需要装饰的对象
    protected Person person;

    public PersonFly(Person person) {
        this.person = person;
    }

    /**
     * 增加了一个飞的功能
     */
    @Override
    public void fly() {
        Log.i(TAG, "fly: ");

    }


    /**
     * 下面是person对象有的方法,调用super去让他调用自己的内部方法,
     * 也可以此基础上增加自己的操作代码
     */
    @Override
    public void run() {
        person.run();
    }

    @Override
    public void eat() {
        person.eat();
    }

    @Override
    public void think() {
        person.think();
    }
}

  



/**
 * create time on  2019/6/16
 * function:  装饰者实现类
 */
public class SuperMan extends PersonFly {

    private String TAG = "chenhua";

    public SuperMan(Person person) {
        super(person);
    }

    @Override
    public void run() {
        super.run();
        Log.i(TAG, "run: superMan");
    }

    @Override
    public void eat() {
        super.eat();
        Log.i(TAG, "eat: superMan");
    }

    @Override
    public void think() {
        super.think();
        Log.i(TAG, "think: superman");
    }

    @Override
    public void fly() {
        super.fly();
        Log.i(TAG, "fly: superman");
    }
}

看下效果:

装饰者模式详解_第4张图片

核心思想

 当我们需要对原有的对象增加功能时且原有对象因为某些条件不适合更改或者无法更改代码时,有2种方法1.继承 2.使用装饰者模式。比如写一个普通人的类,那么抽象出来就是人这个类,如果现在要在普通的人这个类身上加一些行为使之成为超人,但是不是所有的人都是超人,一部分成为超人可以写一个子类,可以直接使用继承。但是java中继承是单一的,无法多继承。装饰者模式就很好的避免了单继承的尴尬,并在也能在不改变原对象结构的情况下增加对象的功能。此外也免去了多层继承关系的复杂问题。

装饰者模式就是首先我们把原对象抽象出来,上面代码中,我们要对普通人进行改装成超人,所以先把对象普通人抽象出来,抽象成人,然后写一个抽象装饰方法,该方法持有人这个类的引用,这样做的好处就是不管什么人都可以改为超人。之后我们可以对抽象的装饰者类实现人的方法(implement Person)这样做是可以修改原对象的方法(即修改传进来的人这个对象),然后我们在implement一个我们需要增加的方法,上面代码中是fly,实现该方法。最后就是创建对象类继承我们的抽象装饰者类即可。这个抽象装饰者类就像装备,穿上就是增加战斗力,实现功能,脱掉的话,对象还是原来的对象,而且只要不继承就可以,像插件,很方便,并且大家都可以用。

 

优缺点

优点:

1、可以替代继承,而且更加灵活,即能动态的增加原对象功能

2、避免继承类过多,提升代码可读性

缺点:

1,如果过多的装饰,代码就比较复杂了,多层装饰让你看不清自己~

 

更多设计模式可以不定期更新哦~

你可能感兴趣的:(设计模式系列)