经过前几篇的介绍相信大家对JAVA的设计模式一定有所解了,本篇我们再一起学习一下适配器模式、代理模式和工厂模式。

  适配器模式使用的场景非常多,例如现实生活中,我们的笔记本电脑的充电线大部分都是三向插头,而当我们遇见一个二向插口时,如何给我们的笔记本充电呢?这时我们就需要一个适配器,帮我们把二向插口转化为三向插口。接下来我们需要讨论的适配器模式,就是如同这里的二向转三向插口,下面我们就以这个现实问题,来用代码实现一下适配器模式。

 1、创建三向电流接口:

/*
* 定义一个三相充电器接口
*/
public interface ThreePathIm { //使用三相电流供电
public void powerWithThree(); }

 2、创建三向电流类:

public class ThreePath implements ThreePathIm {

    public void powerWithThree() {
System.out.println("使用三向电流供电\n");
} }

 3、创建二向电流类:

/*
* 二相电流类
*/
public class TwoPath { public void prowerWithTwo(){
System.out.println("使用二相电流供电");
} }

 4、创建二向接口转三向接口类(接口适配器):

/*
* 电源接口适配器
* 二向接口适配三口接口
*/
public class TwoPlugAdapt implements ThreePathIm { private TwoPath two ; public TwoPlugAdapt(TwoPath two){
this.two = two;
} public void powerWithThree() {
System.out.println("通过适配器转化");
two.prowerWithTwo();
} }

 5、创建继承二向电流类并实现了三向电流接口的类(继承适配器):

/*
* 继承适配器
*/
public class extendsAdapt extends TwoPath implements ThreePathIm { public void powerWithThree() {
System.out.println("\n使用继承适配器转化");
this.prowerWithTwo();
} }

 6、创建测试类:

public class noteBook {

    private ThreePathIm path ;

    private noteBook(ThreePathIm path){
this.path = path;
} private void change(){
path.powerWithThree();
} public static void main(String [] args){ ThreePathIm tpi = new ThreePath();
tpi.powerWithThree(); TwoPath two = new TwoPath();//获得二相接口对象
ThreePathIm three = new TwoPlugAdapt(two);//把二相电流接口转为三向
noteBook notebook = new noteBook(three);
notebook.change(); three = new extendsAdapt();
notebook = new noteBook(three);
notebook.change();
} }

  工程模式使用的场景也比较多,比如之前很火的一款名为脸萌的图片制作软件,我们可以根据我们的需要来选择头发的类型,这是如何实现的呢?下面我们来一起学习一下。
 1、创建头发类型接口:

public interface Hair {

    public void getHair();//获得发型方法

}

 2、通过该方法实现两个头发类型:

  a、左偏分:

public class leftHair implements Hair {

    //左偏分
public void getHair() {
System.out.println("我的头发是左偏分");
} }

  b、右偏分:

public class rightHair implements Hair {

    //右偏分
public void getHair() {
System.out.println("我的头发是右偏分");
} }

 3、创建头发工厂:

public class hairFactory {

    Hair hair;

    //通过关键词来获得相应的头发类型类
public Hair getHairKey(String key){
if("left".equals(key)){
hair = new leftHair();
}else if("right".equals(key)){
hair = new rightHair();
}
return hair;
} //通过类地址来获得相应的头发类型类
public Hair getHairClass(String cls){
try {
hair = (Hair)Class.forName(cls).newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return hair;
} }

 4、创建测试类:

public class hairTest {

    /**
* 测试类
* @param args
*/
public static void main(String[] args) {
Hair hair1 = new leftHair();
Hair hair2 = new rightHair();
hair1.getHair();
hair2.getHair(); //通过工厂对象进行创建类
hairFactory factory = new hairFactory();
Hair hair3 = factory.getHairKey("left");
hair3.getHair(); Hair hair4 = factory.getHairClass("cn.edu.hpu.hair.rightHair");
hair4.getHair();
} }

  代理模式是对一个对象提供一种代理,用来控制对这个对象的控制。

  

  下面我们通过实现一个汽车行驶时,记录行车时间和日志的功能,不多说,上代码:

 1、封装一个汽车行驶的方法:

public interface MoveAble {
public void move();
}

 2、创建一个汽车类:

public class Car implements MoveAble {

    public void move(){
try {
// System.out.println("汽车开始行驶");
// long start = System.currentTimeMillis(); System.out.println("汽车在行驶中");
Thread.sleep(new Random().nextInt(1000));//模拟汽车行驶 // long end = System.currentTimeMillis();
// System.out.println("汽车停止行驶 汽车行驶了:"+(end-start)+"毫秒");
} catch (InterruptedException e) {
e.printStackTrace();
}
} }

 3、实现一个汽车子类:

  通过继承方法,创建不同子类来实现行驶时间和日志的记录。

public class Car2 extends Car {

    public void move() {
System.out.println("汽车开始行驶");
long start = System.currentTimeMillis(); super.move();//执行父类的方法 long end = System.currentTimeMillis();
System.out.println("汽车停止行驶 汽车行驶了:"+(end-start)+"毫秒");
} }

 4、创建接口代理:

  a、时间代理对象:

public class CarTimeProxy implements MoveAble {

    public CarTimeProxy(MoveAble m){
this.m = m;
} public MoveAble m; public void move() { System.out.println("汽车开始行驶");
long start = System.currentTimeMillis(); m.move(); long end = System.currentTimeMillis();
System.out.println("汽车停止行驶 汽车行驶了:"+(end-start)+"毫秒");
} }

  b、日志代理对象:

public class CarLogProxy implements MoveAble {

    public CarLogProxy(MoveAble m) {
super();
this.m = m;
} public MoveAble m; public void move() {
System.out.println("日志开始");
m.move();
System.out.println("日志结束");
} }

 5、测试类:

public class carTest {

    /**
* @param 测试
*/
public static void main(String[] args) {
// Car car = new Car();
// car.move(); //继承模式的静态代理
// Car car = new Car2();
// car.move(); //接口模式的静态代理,叠加操作
Car car = new Car();
MoveAble m1 = new CarTimeProxy(car);
MoveAble m2 = new CarLogProxy(m1);
m2.move();
} }

 6、通过JDK实现代理:

public class TimeHander implements InvocationHandler {

    public TimeHander(Object object) {
super();
this.object = object;
} Object object; /*
* 参数:
* proxy:被代理的对象
* method:被代理对象的方法
* args:方法的参数
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable { System.out.println("汽车开始行驶");
long start = System.currentTimeMillis(); method.invoke(object, null); long end = System.currentTimeMillis();
System.out.println("汽车停止行驶 汽车行驶了:"+(end-start)+"毫秒"); return null;
} }

 7、JDK代理测试:

//jdk动态代理
public class Test {
public static void main(String [] args){
Car car = new Car();
InvocationHandler hander = new TimeHander(car);
Class cls = car.getClass(); MoveAble m = (MoveAble) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), hander);
m.move();
}
}

  截止到本篇关于JAVA中的设计模式已经为大家分析完毕,当然这些都是很基本的东西,想真正的在开发中使用,还需要多多练习。如有疑问,可以留言讨论。

JAVA设计模式《四》的更多相关文章

  1. Java 设计模式(四)-工厂方法模式 (FactoryMethod Pattern)

    1     概念定义 1.1   定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 1.2   类型 创建类模式 2     原理特征 2.1   类 ...

  2. Java 设计模式系列(十四)命令模式(Command)

    Java 设计模式系列(十四)命令模式(Command) 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复 ...

  3. Java 设计模式之建造者模式(四)

    原文地址:Java 设计模式之建造者模式(四) 博客地址:http://www.extlight.com 一.前言 今天继续介绍 Java 设计模式中的创建型模式--建造者模式.上篇设计模式的主题为 ...

  4. 深入探索Java设计模式(四)之享元模式

    享元模式适用于需要大量相同类型对象的情况.在此,设计布局可以减少创建多个对象的方式.对象在运行时会消耗资源,因此最好在内存中使用较少的对象.它减少了内存占用并利用了程序的整体性能.本文是在学习完优锐课 ...

  5. 【白话设计模式四】单例模式(Singleton)

    转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...

  6. Java设计模式(三) 抽象工厂模式

    原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...

  7. Java设计模式(十二) 策略模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...

  8. Java设计模式(二) 工厂方法模式

    本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...

  9. Java设计模式(一) 简单工厂模式不简单

    摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...

  10. Java设计模式(十三) 别人再问你设计模式,叫他看这篇文章

    原创文章,转载请务注明出处 OOP三大基本特性 封装 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的属性和方法只让可信的类操作,对不可信的进行信息隐藏. 继承 继承是指这样一种能力,它可以使 ...

随机推荐

  1. 由XML解析学习工厂模式

    代码段1: startupData = new StartupData(); /* 设定自定义的MyHandler给XMLReader */ StartupXMLHandler startupData ...

  2. [XAF] Simplifying integration of custom controls bound to data from XAF application database

    ASP.NET:  http://www.screencast.com/t/OHhcHD9vy WinForms: http://www.screencast.com/t/8M8K4eskkYO9

  3. JDK和环境配置

    1. JASE : J2SE 这个就是我们现在在学的东西,他是一切Java的核心基础 JAME :J2ME : 他是Java的一个微型版,主要用来做移动开发 JAEE :J2EE Java企业版本,主 ...

  4. ‘ant-version’不是内部或外部命令,也不是可运行的程序

    下载apache-ant-1.9.2-bin.zip后,解压目录:F:\selenium\apache-ant-1.9.2 配置环境变量,在“我的电脑->属性->高级->环境变量 - ...

  5. 快速学习C语言二: 编译自动化, 静态分析, 单元测试,coredump调试,性能剖析

    上次的Hello world算是入门了,现在学习一些相关工具的使用 编译自动化 写好程序,首先要编译,就用gcc就好了,基本用法如下 gcc helloworld.c -o helloworld.o ...

  6. SqlServer2012 数据库的同步问题汇总

    1.当订阅由发布服务器集中管理时正常,而把这些订阅分由订阅服务器管理,在发布服务器初始化订阅时,这些订阅就会出现无法访问某地址的问题,即使添加Everyone的完全控制权限也无用. 2.SqlServ ...

  7. 算法:Astar寻路算法改进,双向A*寻路算法

    早前写了一篇关于A*算法的文章:<算法:Astar寻路算法改进> 最近在写个js的UI框架,顺便实现了一个js版本的A*算法,与之前不同的是,该A*算法是个双向A*. 双向A*有什么好处呢 ...

  8. RCP中如何使用代码安装、运行plugins

    其实在google或者http://www.eclipse.org/forums/就能够找到这个问题的答案. 搜索关键字:rcp install plugins\bundles programmati ...

  9. C#可扩展编程之MEF学习笔记(三):导出类的方法和属性

    前面说完了导入和导出的几种方法,如果大家细心的话会注意到前面我们导出的都是类,那么方法和属性能不能导出呢???答案是肯定的,下面就来说下MEF是如何导出方法和属性的. 还是前面的代码,第二篇中已经提供 ...

  10. c#生成MD5字符串

    public static string EncryptWithMD5(string source) { byte[] sor = Encoding.UTF8.GetBytes(source); MD ...