装饰者设计模式

给一个对象动态的添加一些功能。

一般两种思路来做:

第一种:

做一个接口组件,完了定义的一个具体实现类去实现这个组件,后面我们也就是要修改这个组件具体实现类中的功能,我们对功能进行动态添加,用一个装饰类去实现这个接口,完了把被装饰类的对象给传进来,然后在装饰类中进行功能的拓展。

装饰者设计模式_第1张图片

装饰者设计模式_第2张图片

装饰者设计模式_第3张图片

下面我们就用装饰类来拓展被装饰类功能,可以改变其功能也可以添加其功能,还可以添加新的功能。

装饰者设计模式_第4张图片

装饰者设计模式_第5张图片

下面是主类文件代码的实现:

装饰者设计模式_第6张图片

上面就通过装饰类来调用了被装饰的方法。

下面说另外一种装饰设计模式的实现方法:

给一个抽象类,也就是组件

完了定义一个具体的组件实现类,也就是被装饰的类去继承这个抽象组件

然后定义一个装饰类去继承这个装饰组件,然后内部传入一个被装饰类对象,其实传的是他的父类,实际调用的就是具体实现类中的方法与属性

然后再来写具体组件类,具体组件类实现一个方法中,不同功能的扩展,这也就是为什么继承,要实例化很多类,然后上下文耦合性还比较差的原因。

上面唯一不同的一点就是,它形成了一个装饰类之后,你需要在拓展什么功能,就要单独写每一个装饰器类,去继承父装饰器类,如果是继承,我们每次去改变,都要实例化很多类去继承,然后去改变,这个造成耦合性差和很难管理的问题。

public class Father {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SchoolReport sr=new FouthGradeSchoolReport();//被装饰对象
        
        /*sr.report();
        sr.sign("your father");*/
        HighScoreDecorator sc1=new HighScoreDecorator(sr);
        DescSortDecorator sc2=new DescSortDecorator(sr);
        
        sc1.sign("your father");
    }
}

//学校成绩单报告,我们把它做成抽象类
abstract class SchoolReport
{
    //报告函数,展示成绩情况和相应一些信息
    public abstract void report();
    //成绩单家长签字
    public abstract void sign(String name);
}

//定义具体实现类,这个也就是需要被装饰的类  被装饰类
class FouthGradeSchoolReport extends SchoolReport
{
    public void report()
    {
        System.out.println("尊敬的家长:");
        System.out.println("......");
        System.out.println("语文:62    数学:65     体育:98    自然:63");
        System.out.println("......");
        System.out.println("家长签字");
    }
    
    //登录名字
    public void sign(String name)
    {
        System.out.println("家长签字:"+name);
    }
}


//抽象装饰类(装饰类包括被装饰对象,组件),继承就是为了增加方法嘛 装饰类
abstract class Decorator extends SchoolReport
{
    //首先把装饰对象传过来
    private SchoolReport sr;
    //利用构造函数来传入对象
    public Decorator(SchoolReport sr)
    {
        this.sr=sr;
    }
    //成绩单,注意这个方法是可以被继承下去的
    public void report()
    {
        sr.report();
    }
    //签名
    public void sign(String name)
    {
        sr.sign(name);
    }
}

//----------------------------------------------------------------------//
//用这个类来修饰具体角色,看了这个之后,就可能直接签名了
class HighScoreDecorator extends Decorator
{
    //构造函数
    public HighScoreDecorator(SchoolReport sr)
    {
        super(sr);//生成一个装饰类对像
    }
    //汇报最高成绩
    private void reportHighScore()
    {
        System.out.println("这次考试分数普遍都在70左右");
    }
    //现在增加修饰,就是增加上面的修饰方法,不断增加修饰方法
    //
    public void report()
    {
        super.report();//我要装饰嘛,我就得先把自己有的东西给打出来
        reportHighScore();//再来说一下普通成绩
    }
}

//排名装饰器
class DescSortDecorator extends Decorator
{
    //先实现父类的构造函数,把被装饰对象给传进来嘛
    public DescSortDecorator(SchoolReport sr)
    {
        super(sr);
    }
    
    public void reportSortDesc()
    {
        System.out.println("我在班上排名是38位");
    }
    @Override
    public void report() {
        // TODO Auto-generated method stub
        super.report();
        reportSortDesc();
        
    }
}

 

 

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