接口与设计模式
来源:互联网 发布:女的网络歌手有哪些 编辑:程序博客网 时间:2024/05/22 13:41
Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
接口体现了规范与实现分离的设计哲学,面向接口的设计模式也日益深入人心,下面提供了几个完整的例子,演示了接口的优秀设计,并介绍了java常用的两种设计模式:工厂模式和命令模式。
笔者的开发环境为:java version "1.8.0_40"
1.
//输出设备接口public interface OutputSet{//接口的成员变量只能是常量int MAT_CACHE=50; //最大缓存//接口定义的普通方法只能是public的抽象方法void out();void getData(String msg);//在接口中定义默认方法,需要default修饰--需要至少java8的版本支持default void print(String...msgs){for(String msg : msgs)System.out.println(msg);}//在接口中定义类方法,需要static修饰--需要至少java8的版本支持static String type(){return " 标准输出设备 ";}}
2.
//产品接口public interface Product{int getProduceTime();}
3.至此,可以运行下面的类进行测试:
//打印机类 笔者测试环境:java version "1.8.0_40"public class Printer implements OutputSet,Product{public static void main(String[] args){OutputSet out=new Printer();out.getData("第1张需要打印的文件");out.getData("第2张需要打印的文件");out.out();out.getData("第3张需要打印的文件");out.getData("第4张需要打印的文件");out.getData("第5张需要打印的文件");out.getData(OutputSet.type());out.out();}private String[] printData=new String[MAT_CACHE];private int printNum=0;public void out(){while(printNum>0){System.out.println("打印机打印:"+printData[0]);//把作业队列整体前移一位,并将剩下的需要打印数字减1/*System.arraycopy方法public static void arraycopy(Object src,int srcPos,Object dest,int destPos, int length) 从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。参数:src - 源数组。srcPos - 源数组中的起始位置。dest - 目标数组。destPos - 目标数据中的起始位置。length - 要复制的数组元素的数量。 */System.arraycopy(printData,1,printData,0,--printNum);}}//重写被实现接口的默认方法public void getData(String msg){if(printNum>MAT_CACHE){System.out.println("输出队列已满,添加失败!");}else{printData[printNum++]=msg;}}public int getProduceTime(){return 10;}}
4.
/*面向接口编程--简单工厂模式接口体现了规范与实现分离的设计哲学。*///计算机类:需要添加输出设备,已经实现了与Printer类的松耦合,只是与OutputSet接口耦合public class Computer{private OutputSet out;public Computer(OutputSet o){out=o;}//模拟获取输入的方法public void keyin(String msg){out.getData(msg);}//模拟打印方法public void print(){out.out();}}
5.至此,可以运行下面的类测试工厂模式:
//工厂类负责生成OutputSet对象public class OutputSetFactory{public OutputSet getOutputSet(){//需要为电脑更新设备时,只需要在工厂类里更改方法(改进工艺)即可return new Printer();//return new BetterPrinter();}public static void main(String[] args){OutputSetFactory of=new OutputSetFactory();Computer c=new Computer(of.getOutputSet());c.keyin("计算机输入1");c.keyin("计算机输入2");c.keyin("计算机输入3");c.print();}}
6.加入下面的类,只需更改工厂类里的一个方法即可(详见工厂类注释)
//更好的打印机类 笔者测试环境:java version "1.8.0_40"public class BetterPrinter implements OutputSet,Product{private String[] printData=new String[MAT_CACHE];private int printNum=0;public void out(){while(printNum>0){System.out.println("更好的打印机打印:"+printData[0]);System.arraycopy(printData,1,printData,0,--printNum);}}//重写被实现接口的默认方法public void getData(String msg){if(printNum>MAT_CACHE){System.out.println("输出队列已满,添加失败!");}else{printData[printNum++]=msg;}}public int getProduceTime(){return 10;}}
下面是命令模式
7.
//面向接口编程--简单命令模式//操作int数组的接口public interface Command{//封装“处理行为的方法”void process(int[] target);}
8.
//处理数组的处理类public class ProcessArray{public void process(int[] target,Command cmd){cmd.process(target);}}
9.
//打印数组的操作类public class PrintCommand implements Command{ public void process(int[] target) { for(int tar : target) System.out.println("迭代输出目标数组"+tar); }}
10.
//获取数组元素和的操作类public class AddCommand implements Command{ public void process(int[] target) { int sum=0; for(int tar : target) sum+=tar; System.out.println("数组元素和"+sum); }}
11.至此可以测试命令模式:
//测试类public class CommandTest{ public static void main(String[] args) { ProcessArray pa=new ProcessArray(); int[] target={5,0,8,10}; pa.process(target,new PrintCommand()); pa.process(target,new AddCommand()); }}
1 0
- 接口与设计模式
- 接口与适配器设计模式
- 设计模式-工厂方法设计模式与接口的应用
- C语言设计模式与接口
- 接口与工厂(设计模式)
- 抽象类与接口与模板方法设计模式
- Java接口设计模式
- Java接口设计模式
- Java接口设计模式
- 接口及其设计模式
- javascript设计模式--接口
- 【设计模式】之接口
- Java设计模式---接口
- Java接口设计模式
- 接口设计模式
- JavaScript设计模式-接口
- 常量接口设计模式
- JavaScript设计模式 --- 接口
- Linux内核中的常用宏container_of其实很简单
- ORACLE 操作 CLOB 字段
- 使用Ant打包部署STAF插件
- 5种提高SQL性能的方法
- 并查集
- 接口与设计模式
- 关于typedef的用法总结
- 边框scrollTop offsetTop 详解
- 詩經UL.KUOPIGN甲骨文信息顯相:國風(國即大學).鵲巢(邦即國家)
- 二叉树中的那些常见的面试题
- Ajax load()方法
- 为什么宏INT_MIN要写成-2147483647-1
- NOJ 比赛成绩查询问题II hash_map
- oc 在Appdelegate添加私有方法和属性