装饰模式笔记

来源:互联网 发布:十一双十一淘宝 编辑:程序博客网 时间:2024/05/29 03:07

1. 装饰模式介绍

         装饰模式也称包装模式,结构型设计模式之一,其使用一种对客户端透明的方式来动态地扩展对象的功能,同时它也是继承关系的一种替代方案之一。现实生活中,你能看到很多装饰模式的例子,比如说人需要各式各样的衣着,不管你穿着什么样的衣物,对于个人的本质来说是不变的,充其量只是在外面披上一层遮羞物而已,这也是装饰模式。

2.装饰模式的定义

        动态地给一个对象添加一些额外的职责。

3.应用场景

         需要透明且动态地扩展类的功能时。比如说Android中给RecyclerView添加头布局和尾布局。

4.简单应用。

package com.ljt.decorationmodel;/** * Created by ljt on 2017/5/20/020. */public abstract class Person {    /*    * Person下有一个穿着的抽象方法    * */    public abstract void dressed();}

public class PersonCloth extends  Person{    //保持一个Person类的引用,作用:可以方便地调用具体被装饰对象中的方法    protected  Person mPerson;    public PersonCloth(Person mPerson) {        this.mPerson = mPerson;    }    @Override    public void dressed() {        //调用Person类中的dressed方法        mPerson.dressed();    }}

public class Boy extends Person{    @Override    public void dressed() {        System.out.println("只穿内裤");    }}

public class CheapCloth extends PersonCloth {    public CheapCloth(Person mPerson) {        super(mPerson);    }    public void dressShorts(){        System.out.println("穿条短裤");    }    @Override    public void dressed() {        super.dressed();        dressShorts();    }}

public class ExpensiveCloth extends PersonCloth {    public ExpensiveCloth(Person mPerson) {        super(mPerson);    }    /*        穿短袖    * */    private void dressShirt(){        System.out.println("穿件短袖");    }    /*    * 穿皮衣    * */    private void dressLeather(){        System.out.println("穿件皮衣");    }    @Override    public void dressed() {        super.dressed();        dressLeather();        dressShirt();    }}

public class TestDecorationModel {    public static void main(String[] args){        Person person=new Boy();        CheapCloth cheapCloth = new CheapCloth(person);        cheapCloth.dressed();        System.out.println("----------------------");        //给他穿上贵的衣服        PersonCloth personCloth=new ExpensiveCloth(person);        personCloth.dressed();    }}

运行结果: