设计模式之装饰模式

上一篇文章说我们的计算器问题,我们可以用策略和简单化工厂来实现何时如何调用我们的算法,但是计算器每次都只能有一个操作吗?比如加的时候只能加,减的时候只能减吗 ?答案是否定的,计算器想何时加何时减都行,那么我们怎么来组装这些东西呢。我的观点是我们可以把每一种算法看做是一个组件,就像人衣着一样,我们可以穿西服,可以穿休闲装,还可以穿大裤衩。那么我的计算器是不是也能像这样 随意的搭配,想怎么搭配都行呢!我们把上篇文章的opreation 稍微改变一下就实现了。

代码如下

public class Operate{

    public static double numberA;
    public  static double numberB;
    public Operate operate;
    public static double result=0d;
    public void setOperate(Operate o){//这里面装饰的是自己Operate,如果装饰其他类的话,需要继承其他类
    this.operate=o;
    }
 public double getResult(){//执行自己的getresult方法,
if(operate!=null){
System.out.println("----------------5-------"+result);
result=operate.getResult();
}
return result;
}
 public class Add  extends Operate{//包装对象
 public double getResult(){
 System.out.println("----------------4-------"+result);
 super.result=super.result+numberA+numberB;//拓展功能,相当于装饰部分,
super.getResult();//执行父类的功能,
return super.result;
}
 }
 public class Sub  extends Operate{
 public double getResult(){
 System.out.println("----------------3-------"+result);
 super.result=super.result+numberA-numberB;
super.getResult();
return super.result;
}
 }
 public class Mul  extends Operate{
 public double getResult(){
 System.out.println("----------------2------"+result);
 super.result=super.result+numberA*numberB;
super.getResult();
return super.result;
}
 }
 public class Div  extends Operate{
 public double getResult(){
 
 System.out.println("----------------1-----------"+result);
 super.result=super.result+numberA/numberB;
super.getResult();
return super.result;
}

 }

}

这里我为啥用supper.result,为啥没有直接用result 是因为,我为了简便我直接写的内部类,其实是应该是把类单独提出来的,我这里也是区分一下。

再来看客户端的代码

Operate op= new Operate();
Add a= new Operate().new Add();
Sub b= new Operate().new Sub();
Mul c= new Operate().new Mul();
Div d= new Operate().new Div();
a.setOperate(op);
b.setOperate(a);
c.setOperate(b);

d.setOperate(c);

我们可以把opreate 看做一个运算框子,这个框子才是我们的核心功能,我们会往这个框子里面加一些我们需要的算法,比如我们加法那么我们就 b.setOperate(a);往里面添加一个Add 算法,这样也可以看做我们往opreate扩展了一个加法的功能,相当于向旧的类添加了新的代码,这样做的好处 我们可以把核心的代码写在一个类里面,封闭原则也得到体现,某些特定的代码写在扩展类里面,使用的时候往里面添加就行了,比如运算这个框子,得到结果是这个框子的核心功能,至于怎么计算,交给扩展类!这样每个扩展类不用知道什么时候被使用只需要知道自己的功能就行!!菜鸟学习中,欢迎指点!!!


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页