装饰模式(结构类)

    xiaoxiao2021-12-14  16

    UML

    component角色: Component 是一个接口或者一个抽象类,就是定义我们最核心的对象,也就是最原始的对象ConcreteComponent 角色: 定义一个将要接收附加责任的类Decorator角色: 持有一个构建对象的实例,并定义一个与抽象构件接口一致的接口Concrete Decorator角色: 负责给构件对象”贴上”附加的责任

    描述

    意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活优点: 装饰类和被装饰类可以独立发展 , 而不会相互耦合; 缺点: 多层装饰设计复杂应用: Java IO设计

    例子

    UML

    代码

    SchoolReport(Component)

    public abstract class SchoolReport { public abstract void report() ; public abstract void sign(String name) ; }

    FourthSchoolReport(ConcreteComponet)

    package decorator; public class FourthGradeSchoolReport extends SchoolReport{ @Override public void report() { System.out.println("尊敬的XXX家长"); System.out.println("..........."); System.out.println("语文62 , 数学65 , 体育98 , 自然63"); System.out.println(" 家长签名: "); } @Override public void sign(String name) { System.out.println("家长签名为: " + name); } }

    Decorator(Decorator)

    public class Decorator extends SchoolReport{ protected SchoolReport sr ; public Decorator(SchoolReport sr){ this.sr = sr ; } public void report(){ this.sr.report() ; } public void sign(String name){ this.sr.sign(name) ; } }

    HignScoreDecorator(ConcreteDecorator)

    public class HignScoreDecorator extends Decorator{ public HignScoreDecorator(SchoolReport sr) { super(sr); } public void reportHignScore(){ System.out.println("这次考试的语文最高分为75,数学是80,自然是80"); } public void report(){ this.reportHignScore(); super.sr.report(); } }

    SortDecorator(Decorator)

    public class SortDecorator extends Decorator{ public SortDecorator(SchoolReport sr) { super(sr); } @Override public void report(){ super.sr.report(); this.sortReport() ; } private void sortReport() { System.out.println("这次排名我是第38名"); } }

    Father(Client)

    public class Father{ public static void main(String[] args) { SchoolReport sr = new FourthGradeSchoolReport() ; sr = new HignScoreDecorator(sr) ; sr = new SortDecorator(sr) ; sr.report(); sr.sign("老三"); } }

    例子2

    描述

    Java IO中的装饰模式

    UML

    参考

    <<设计模式之禅>> << java与模式>>

    转载请注明原文地址: https://ju.6miu.com/read-968911.html

    最新回复(0)