装饰模式简单使用

21 篇文章 0 订阅
19 篇文章 0 订阅

前言

装饰模式又叫包装模式,字如其意,就是把一个事物包装起来,增加一些修饰物,动态的给一个对象添加一些额外的指责,这和继承有异曲同工的意思,对于增加一些功能来说,装饰模式比写子类来的爽快,这样说来平时随手都是装饰模式,随便来段代码:

     @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        initView();
        initTitle();
        initData();
        initOnClickListener();
        ((BaseActivity) this.getActivity()).setCurrentVisiableFragment(this);
    }

这里面就用到了装饰模式,新增方法就是起到了修饰作用。

适用场景

这个很明显了,就是需要动态的去扩展类的方法,需要综合分析一下,继承和装饰谁更适合。

角色扮演

Component:抽象组件,可以是一个接口也可以是抽象类,就是装饰的原始对象。
ConcreteComponent:组件类的实现类,就是基本实现,其实也就是具体对象。
Decorator:抽象装饰类,其职责是装饰原始对象。只有一个具体实现类的时候,可以省略这个抽象类。
ConcreteDecorator:装饰者具体实现类,只是对抽象借口的具体实现。

Demo

抽象一个简单的过程:项目组有两个产品经理,然后一些程序员,下面来演示一个项目开发到结束的过程,首先我们抽象出Component:

 package com.demo.decorator;

/**
 * Created by italkbb on 2017/12/29.
 */

public abstract class Project {
    /**
     * Project里面所有人都要工作
     */
    public abstract void doWork();
}

程序员 ConcreteComponent:

 package com.demo.decorator;

/**
 * Created by italkbb on 2017/12/29.
 */

public class Coder extends Project {
    @Override
    public void doWork() {
        doCoding();
    }

    private void doCoding() {
        System.out.println("编码");
    }
}

然后手机产品经理,为了突出问题我们写两个产品经理:

package com.demo.decorator;

/**
 * Created by italkbb on 2017/12/29.
 */

public abstract class Manager extends Project {
    private Project projcet;

    public Manager(Project projcet){
        this.projcet = projcet;
    }
    @Override
    public void doWork() {
        earlyWork();
        projcet.doWork();
        endWork();
    }

    /**
     * 管理者要在编码前需求之类的
     */
    protected abstract void earlyWork();

    /**
     * 管理者要在编码后做收尾工作
     */
    protected abstract void endWork();
}

具体的实现类(ConcreteDecorator):

package com.demo.decorator;

/**
 * Created by italkbb on 2017/12/29.
 */

public class ManagerA extends Manager {
    public ManagerA(Project projcet) {
        super(projcet);
    }

    @Override
    protected void earlyWork() {
        System.out.println("经理A做需求分析");
        System.out.println("经理A找个项目框架");
        System.out.println("经理A详细设计");
    }

    @Override
    protected void endWork() {

    }
}
package com.demo.decorator;

/**
 * Created by italkbb on 2017/12/29.
 */

public class ManagerB extends Manager {
    public ManagerB(Project projcet) {
        super(projcet);
    }

    @Override
    protected void earlyWork() {

    }

    @Override
    protected void endWork() {
        System.out.println("经理B做收尾工作");
    }
}

后期再以一个activity装饰模式来使用我们的demo:

 package com.demo.decorator;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import teltplay.example.com.kotlindemo.R;

public class DecoratorActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        initDate();

        initView();
    }

    /**
     * 加载数据
     */
    private void initDate() {
        Project coder = new Coder();        //代码工人
        Project managerA = new ManagerA(coder); //项目经理
        Project managerB = new ManagerB(coder); //项目经理

        // 项目经理开启项目开发
        managerA.doWork();
        managerB.doWork();
    }

    /**
     * 初始化界面
     */
    private void initView() {
        setContentView(R.layout.activity_decorator);
    }


}

这样简单的装饰模式就完成了。

后记

装饰者模式替代了继承关系,简化了程序结构,为其装饰的对象增强功能,可能会和代理模式混淆,但是代理模式是对代理的对象完成控制,但不会对本身的功能进行强化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值