接口(工厂模式&代理模式)
程序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
接口(工厂模式&代理模式)的更多相关文章
- java设计模式,工厂,代理模式等
javaEE设计模式: 工厂模式:主要分为三种模式: 定义:在基类中定义创建对象的一个接口,让子类决定实例化哪个类.工厂方法让一个类的实例化延迟到子类中进行. 为什么要使用工厂模式: (1) 解耦 : ...
- java设计模式--结构型模式--代理模式
代理模式 概述 为其他对象提供一种代理以控制对这个对象的访问. 适用性 1.远程代理(RemoteProxy)为一个对象在不同的地址空间提供局部代表. 2.虚代理(VirtualProxy)根据需要创 ...
- Proxy模式 代理模式
Android的 LocalWindowManager 和 WindowManagerImgl 都实现了WindowManager接口.LocalWindowManager 中保存一个WindowMa ...
- 结构型模式 -- 代理模式(静态代理&动态代理)
静态代理: 真实角色和代理角色实现相同的接口,代理角色拥有真实角色的引用.代理角色去执行方法,对于某些"真正"需要真实角色自己执行的方法时,在代理角色内部就调用真实角色的方法,其他 ...
- JAVA设计模式(09):结构型-代理模式(Proxy)
代理模式是经常使用的结构型设计模式之中的一个,当无法直接訪问某个对象或訪问某个对象存在困难时能够通过一个代理对象来间接訪问,为了保证client使用的透明性,所訪问的真实对象与代理对象须要实现同样的接 ...
- javascript设计模式——代理模式
前面的话 代理模式是为一个对象提供一个占位符,以便控制对它的访问. 代理模式是一种非常有意义的模式,在生活中可以找到很多代理模式的场景.比如,明星都有经纪人作为代理.如果想请明星来办一场商业演出,只能 ...
- Java进阶篇设计模式之七 ----- 享元模式和代理模式
前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...
- Java设计模式之七 ----- 享元模式和代理模式
前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...
- 设计模式(12)--Proxy(代理模式)--结构型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. ...
随机推荐
- 局域网yum服务器创建
yum createrepo createrepo dir 配置httpd发布yum-repo; 在客户端添加yum.rep配置文件;
- DOCTYPE与浏览器模式详解(标准模式&混杂模式)
关于渲染模式: 在多年以前(IE6诞生以前),各浏览器都处于各自比较封闭的发展中(基本没有兼容性可谈).随着WEB的发展,兼容性问题的解决越来 越显得迫切,随即,各浏览器厂商发布了按照标准模式(遵循各 ...
- A Tour of Go The new function
The expression new(T) allocates a zeroed T value and returns a pointer to it. var t *T = new(T) or t ...
- Golang项目目录结构组织
其实golang的工程管理还是挺简单的,完全使用目录结构还有package名来推导工程结构和构建顺序. 当然,首先要说的是环境变量$GOPATH,项目构建全靠它.这么说吧,想要构建一个项目,就要将这个 ...
- 以管理员身份启动ClickOnce部署的应用程序
ClickOnce方式部署应用简单方便,估计很多人都用过,但这种方式存在一定的“缺陷”,即以管理员方式启动应用的问题,虽然出于安全考虑可以理解,但给需要管理员权限才能正常运行的程序带来了一定的麻烦,这 ...
- android FakeWindow的小应用大用途
android FakeWindow的小应用大用途 在windowmanager里面有一个FakeWindow,细致一看也就是一个透明的应用覆盖到屏幕的最前端,这样有什么优点呢?首先我们还是从应用的需 ...
- 向架构师进军--->怎样编写软件架构文档
假设你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",增加这个PM.架构师的大家庭 问:为什么要编写软件架构文档,它的优点是什么? 答: 有文档的架构有助于不同利益相关 ...
- 为一张PCI卡打通经络的过程
一张PCI卡通过“一转二”的转接卡插在主板上,probe调用失败,日志显示读取配置空间的时候发生了奇偶校验错误,可是使用相同的转接卡把它插在另外一台相同机器的主板上时,却运行正常,这就说明不是转接卡的 ...
- 【转】CCUserDefault类深入分析——2013-08-25 22
http://game.dapps.net/gamedev/game-engine/8792.html 另:本章所用Cocos2d-x版本为: 2.1.1 (2013-01-28) 大家好,今天我们来 ...
- 不支持的关键字:“provider connection string”报错信息及解决方案
今天在部署公司开发框架的时候 ,登录系统之后调用代办列表的时候就报错了 总线调用契约XX.Service.Contracts.IXXService上的GetXXCount方法时出错. Resoluti ...