程序1:简单的接口功能
package com.liaojianya.chapter2;/** * 编写程序实现一个usb接口,定义设备来使用这个接口,从而计算机可以调用具有usb接口的设备。 * @author LIAO JIANYA * 2016年7月27日 */public class InterfaceStandards{ public static void main(String[] args) { Computer com = new Computer(); com.plugin(new Flash());//在电脑上使用U盘 com.plugin(new Print());//在电脑上使用打印机 }}//定义USB接口标准interface USB{ public void work();}//在电脑上使用具有USB接口的设备class Computer{ public void plugin(USB usb) { usb.work(); }}//打印机实现USB接口标准class Print implements USB{ public void work() { System.out.println("打印机用USB接口,连接开始工作"); }}//U盘实现USB接口标准class Flash implements USB{ public void work() { System.out.println("U盘使用USB接口,连接开始工作"); }}
运行结果:
U盘使用USB接口,连接开始工作打印机用USB接口,连接开始工作
分析:
按照固定的USB接口标准,可以定义无数多个子类,并且这些子类可以在电脑上使用。
程序2:工厂模式
package com.liaojianya.chapter2;/** * * @author LIAO JIANYA * 2016年7月27日 */public class SimpleFactoryTest{ public static void main(String[] args) { Animal an = Factory.getInstance("lion"); an.behaviour(); an = Factory.getInstance("bird"); an.behaviour(); }}//定义一个动物标准interface Animal{ public void behaviour();}class Lion implements Animal{ public void behaviour() { System.out.println("狮子跑"); }}class Bird implements Animal{ public void behaviour() { System.out.println("鸟儿飞"); }}class Factory{ public static Animal getInstance(String className) { if("lion".equals(className)) { return new Lion(); } if("bird".equals(className)) { return new Bird(); } return null; }}
运行结果:
狮子跑鸟儿飞
分析:
1)根据参数的内容实例化不同的子类,参数内容为“lion”,实例化的就是Lion类,参数内容为“bird”,实例化的就是Bird类,所以输出内容也不同。
2)此时的程序,客户端没有呵呵具体的子类耦合在一起,这样,如果再有更多的Animal接口的子类粗线,只需要修改Factory类即可,即所有的接口对象都是通过Factory类取得。
程序3:代理设计模式
package com.liaojianya.chapter2;/** * 设计代理模式,用红酒厂商、代理商、客户来阐释代理的作用 * @author LIAO JIANYA * 2016年7月27日 */public class ProxyTest{ public static void main(String[] args) { Subject sub = new ProxySubject();//客户直接找代理,子类为接口实例化 sub.request(); }}//代理请求abstract class Subject{ abstract public void request();}//真实角色(红酒厂商)class RealSubject extends Subject{ public void request() { System.out.println("我是红酒厂商,欢迎品尝购买!"); }}//代理角色(代理商)class ProxySubject extends Subject{ private RealSubject realSubject; public void request() { preRequest(); if(realSubject == null) { realSubject = new RealSubject(); } realSubject.request(); postRequest(); } private void preRequest() { System.out.println("前期宣传活动,免费品尝"); } private void postRequest() { System.out.println("结束宣传活动,付费购买"); }}
运行结果:
前期宣传活动,免费品尝我是红酒厂商,欢迎品尝购买!结束宣传活动,付费购买
分析:代理设计模式的核心组成部分:一个接口两个子类,一个子类负责真实的业务操作功能,如红酒厂商;一个子类负责完成与真实业务相关的操作,如红酒代理商。
程序4:接口与抽象类设计
package com.liaojianya.chapter2;import java.util.Scanner;/** * 利用接口及抽象类设计实现: * 1)定义接口圆形CircleShape,其中定义常量PI,提供方法computeArea()计算面积 * 2)定义圆形类Circle实现接口CircleShape,包含构造方法和求圆形周长方法; * 3)定义圆柱继承Cicle实现接口CircleShape,包含构造方法,圆柱表面积,体积; * 4)从控制台输入圆半径,输出圆面积及周长; * 5)从控制台输入圆柱底面半径及高,输出圆柱底面积、圆柱表面积及体积。 * @author LIAO JIANYA * 2016年7月27日 */public class InterfaceAndAbstract{ public static void main(String[] args) { Scanner san = new Scanner(System.in); System.out.println("输入圆的半径:"); double r = san.nextDouble(); Circle circle = new Circle(r); System.out.println("圆的面积为:" + circle.computeArea() + ",圆的周长为:" + circle.computeGirth()); System.out.println("输入圆柱底面半径:"); r = san.nextDouble(); System.out.println("输入圆柱高:"); double h = san.nextDouble(); Cylinder cylinder = new Cylinder(r, h); System.out.println("圆柱的底面积为: " + cylinder.computeBaseArea() + ",圆柱的表面积为:" + cylinder.computeSurfaceArea() + ",圆柱的体积为:" + cylinder.computeVolune()); san.close(); }}interface CircleShape{ public static final double PI = 3.14; public double computeArea();}class Circle implements CircleShape{ double area; double girth; double r; public Circle(double r) { this.r = r; } public double computeArea() { return area = PI * r * r; } public double computeGirth() { return girth = 2 * PI * r; }}class Cylinder extends Circle implements CircleShape{ double baseArea; double sufaceArea; double volume; double h; public Cylinder(double r, double h) { super(r); this.h = h; } public double computeBaseArea() { return baseArea = super.computeArea(); } public double computeSurfaceArea() { return sufaceArea = super.computeGirth() * h; } public double computeVolune() { return volume = baseArea * h; }}
运行结果:
输入圆的半径:1圆的面积为:3.14,圆的周长为:6.28输入圆柱底面半径:1输入圆柱高:2圆柱的底面积为: 3.14,圆柱的表面积为:12.56,圆柱的体积为:6.28