面向接口之简单工厂模式和命令模式

  接口体现的是一种规范和实现分离的设计哲学,充分利用接口可以极好的降低程序各模块间的耦合,从而提高系统的扩展性和可维护性。
  基于这一原则,很多软件架构设计理论都倡导“面向接口”编程,而不是面向实现类编程,希望通过面向接口编程来降低程序的耦合。

1、简单工厂模式

正常代码如下,Printer类实现了Output接口

//代码1
interface Output{
    static final int MAX_CACHE_LINE = 50;
    void out();
    void getData(String msg);
}
public class Printer implements Output{
    //存储打印对象的数组
    private String [] printData=new String [MAX_CACHE_LINE];
    //存储对象的数目
    private int dataNum=0;
    //
    @Override
    public void out() {
        while (dataNum>0){
            //打印第一个对象,之后数组整体前移一位
            System.out.println("Printer打印了——:"+printData[0]);
            System.arraycopy(printData,1,printData,0,--dataNum);
        }

    }
    public void getData(String msg) {
        if(dataNum>MAX_CACHE_LINE){
            System.out.println("糟糕!!!打印序列已满,添加失败!");
        }
        else{
            printData[dataNum++]=msg;
        }
    }
    public static  void main(String args[]){
        Output o=new Printer();
        o.getData("Hello World!!!");
        o.getData("Hello Cruel World!!!");
        o.out();
    }
}

假如需要在一个Computer类中,组合Printer。如果选择让Computer类组合Printer则代码如下;

//代码2
package CodingFaceToInterface;

interface Output{
    static final int MAX_CACHE_LINE = 50;
    void out();
    void getData(String msg);

}
public class Printer implements Output{
    //存储打印对象的数组
    private String [] printData=new String [MAX_CACHE_LINE];
    //存储对象的数目
    private int dataNum=0;
    //
    @Override
    public void out() {
        while (dataNum>0){
            //打印第一个对象,之后数组整体前移一位
            System.out.println("Printer打印了——:"+printData[0]);
            System.arraycopy(printData,1,printData,0,--dataNum);
        }

    }
    public void getData(String msg) {
        if(dataNum>MAX_CACHE_LINE){
            System.out.println("糟糕!!!打印序列已满,添加失败!");
        }
        else{
            printData[dataNum++]=msg;
        }
    }

}
class Computer{
    /*在Computer类中,组合了一个Printer对象
    如果后续的开发过程中,Printer类变化了,比如说增强了,变成了superPrinter
    那么,就得需要到Computer修改了,如果有成千上万个类,都组合了Printer,
    那么改起来会十分的麻烦。
     */
    Printer  p=new Printer();

    void pckeyIn(String msg){
        p.getData(msg);
    }
    void pcPrint(){
        p.out();
    }
    public static  void main(String args[]){

        Computer c=new Computer() ;
        c.pckeyIn("Hello");
        c.pckeyIn("Cruel");
        c.pckeyIn("World");
        c.pcPrint();
    }


}

3、如果在Computer类中,组合一个output对象,代码如下。

//代码三
package CodingFaceToInterface;

interface Output{
    static final int MAX_CACHE_LINE = 50;
    void out();
    void getData(String msg);

}
public class Printer implements Output{
    //存储打印对象的数组
    private String [] printData=new String [MAX_CACHE_LINE];
    //存储对象的数目
    private int dataNum=0;
    //
    @Override
    public void out() {
        while (dataNum>0){
            //打印第一个对象,之后数组整体前移一位
            System.out.println("Printer打印了——:"+printData[0]);
            System.arraycopy(printData,1,printData,0,--dataNum);
        }

    }
    public void getData(String msg) {
        if(dataNum>MAX_CACHE_LINE){
            System.out.println("糟糕!!!打印序列已满,添加失败!");
        }
        else{
            printData[dataNum++]=msg;
        }
    }

}
class  outputFactory{

    public Output getOutputFactory(){

        return new Printer();
    }
        /*
    假如 claas  SuperPrinter implements Output{
    }
    我们想让Computer使用,SuperPrinter
    只需要  public Output getOutputFactory(){

        return new SuperPrinter();
    }

     */
    public static  void main(String args[]){
        outputFactory o=new outputFactory();
        Computer c=new Computer(o.getOutputFactory()) ;
        c.pckeyIn("Hello");
        c.pckeyIn("Cruel");
        c.pckeyIn("World");
        c.pcPrint();
    }

}

class Computer{
    //接口无法实例化,此处只是定义了一个变量,并没有实例化
   private Output  o;
  //构造器,传参为Output类型的变量
    Computer(Output o){
    this.o=o;
    }

    void pckeyIn(String msg){
        o.getData(msg);
    }
    void pcPrint(){
        o.out();
    }



}


2、命令模式

某个方法,要完成某一行为,但行为的具体实现无法确定,必须要等到执行到该方法时才能确定。


package CommandMode;

public interface Command{
    //接口李定义的process方法用于封装“处理行为”
    void process(int[]  target);
}
class PrintCommand implements Command{
    @Override
    public  void process(int[] target){
        for (int inTem:target) {
            System.out.println("输出目标数组的元素:"+inTem);
        }
    }
        }
class  AddCommand implements Command{
    @Override
    public void process(int[] target) {
        int sum=0;
        for (int inTem:target){
            sum+=inTem;
        }
        System.out.println("对数组求和的结果是:"+sum);
    }
}
class ProcessArry{

    public void process(int[] target,Command cmd){
        cmd.process(target);
    }
}
class  testCommand{
    public  static void main(String args[]){
        int[]  tar={0,1,2,3,4,5,6,7,8,9,10,};
        ProcessArry p=new ProcessArry();
        p.process(tar,new PrintCommand());
        p.process(tar,new AddCommand());

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值