接口(工厂模式&代理模式)
程序1:简单的接口功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | 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接口,连接开始工作" ); } } |
运行结果:
1 2 | U盘使用USB接口,连接开始工作 打印机用USB接口,连接开始工作 |
分析:
按照固定的USB接口标准,可以定义无数多个子类,并且这些子类可以在电脑上使用。
程序2:工厂模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | 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 2 | 狮子跑 鸟儿飞 |
分析:
1)根据参数的内容实例化不同的子类,参数内容为“lion”,实例化的就是Lion类,参数内容为“bird”,实例化的就是Bird类,所以输出内容也不同。
2)此时的程序,客户端没有呵呵具体的子类耦合在一起,这样,如果再有更多的Animal接口的子类粗线,只需要修改Factory类即可,即所有的接口对象都是通过Factory类取得。
程序3:代理设计模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | 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( "结束宣传活动,付费购买" ); } } |
运行结果:
1 2 3 | 前期宣传活动,免费品尝 我是红酒厂商,欢迎品尝购买! 结束宣传活动,付费购买 |
分析:代理设计模式的核心组成部分:一个接口两个子类,一个子类负责真实的业务操作功能,如红酒厂商;一个子类负责完成与真实业务相关的操作,如红酒代理商。
程序4:接口与抽象类设计
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | 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 2 3 4 5 6 7 8 | 输入圆的半径: 1 圆的面积为: 3.14 ,圆的周长为: 6.28 输入圆柱底面半径: 1 输入圆柱高: 2 圆柱的底面积为: 3.14 ,圆柱的表面积为: 12.56 ,圆柱的体积为: 6.28 |
烧不死的鸟就是凤凰
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)