MyException - 我的异常网
当前位置:我的异常网» 设计模式 » JAVA学习笔记-对策设计模式与适配器模式

JAVA学习笔记-对策设计模式与适配器模式

www.MyException.Cn  网友分享于:2013-04-21  浏览:0次
JAVA学习笔记--策略设计模式与适配器模式

一、策略设计模式

  创建一个能够根据所传递对象的不同而具有不同行为的方法被称为策略设计模式;这类方法包含所要执行的算法中固定不变的部分,而“策略”包含变化的部分策略就是传递进去的参数对象,它包含要执行的代码。

  这种设计模式将算法分别独立封装起来,然后将其当做参数传递给方法从而让方法产生不同的行为,不同的算法可以进行替换(就像给方法不同的实参)。我们可以知道,在策略设计模式中有三个部分:策略、策略引用、接收策略引用的方法(这是笔者自己根据理解给出的名词,并没有查询有没有这些术语)。下面通过一个例子简单介绍一下策略设计模式:

package com.tongye.strategy;

/* 基类,这里可以是普通类,也可以是一个接口 */
abstract class Shape{
    public abstract void outputShape();
}

/* 策略 */
class Circle extends Shape{
    public void outputShape(){
        System.out.println("this is a circle");
    }
}

/* 策略 */
class Square extends Shape{
    public void outputShape(){
        System.out.println("this is a square");
    }
}

/* 策略 */ 
class Triangle extends Shape{        
    public void outputShape(){
        System.out.println("this is a triangle");
    }
}

public class Strategy {
    /* Strategy.strategic()方法接收一个Shape类型的引用作为参数
     * 这个引用可以是任何类型的Shape,如Circle、Square、Triangle
     * 根据所传递参数的不同,strategic方法有不同的行为略
     *  */
    public static void strategic(Shape S){    // 接收策略引用的方法,S是策略引用
        S.outputShape();                    // 方法中固有不变的部分
    }
    
    public static void main(String[] args){
        strategic(new Circle());    // 新建Circle()对象作为strategic()方法的参数,这里的circle()对象就是一个策略,这里用到了向上转型
        strategic(new Square());    // 策略Square()对象
        strategic(new Triangle());  // 策略Triangle()对象
    }
}

/*
 * output:
 * this is a circle
 * this is a square
 * this is a triangle
 * */

  通过上面的一小段代码,我们知道,strategic方法可以根据所传递参数的不同而产生不同的行为,这些行为被封装在不同的策略中,这就是策略设计模式。通过将不同的行为封装到不同的策略中,我们可以随时更换策略从而实现不同的行为,从而使得程序更为灵活,更易于维护。

 

 二、适配器模式

   举个简单的例子,当我们给手机充电时,由于手机充电口是5V,而插座提供的是220V交流电,因此我们通常需要使用充电器将220V交流电转换成可供手机充电用的5V直流电,这个充电器就是一个适配器。

  同样,在编写JAVA程序时,我们可能会遇到这样一种情况:我们需要一个类A来实现接口B,但是类A并没有实现接口B中的所有方法,而类A是不能被改变的,这时我们可以创建一个类C,它继承类A并实现接口B,这个类C就是一个适配器。适配器中的代码将接受你所拥有的接口,并产生你所需要的接口。适配器模式有两张:类适配器模式和对象适配器模式。下面用两个例子来简单演示一下:

1、类适配器模式:

/*****************************/
package com.tongye.adapters;

public interface TargetInterface {
    void method1();
    void method2();
}


/*****************************/
package com.tongye.adapters;

/* 源类,我们需要这个类实现接口  TargetInterface,但这个类不能被改变 
 * 源类与接口之间是没有关系的
 * */
class BeAdapted{
    public void method1(){
        System.out.println("method1");
    }
}

/* 这是适配器,它接受了BeAdapted中已有的接口并产生我们需要的接口
 * method1()方法继承自BeAdapted类(即已有的接口),不用再作声明
 * 这里适配器的作用相当于为源类与接口之间建立了一种关系,类似于 implements
 *  */
class Adapter extends BeAdapted implements TargetInterface{
    public void method2(){                // method2()方法无法通过继承获得,因而需要自己声明,这就是适配器为我们产生的接口
        System.out.println("method2");
    }
}

public class ClassAdapter {
    public static void main(String[] args){
        Adapter adapt = new Adapter();
        adapt.method1();
        adapt.method2();
    }
}

Adapter与BeAdapted是继承关系,即为类适配器模式。

 

2、对象适配器模式:

/*****************************/
package com.tongye.adapters;

public interface TargetInterface {
    void method1();
    void method2();
}

/*****************************/
package com.tongye.adapters;

/* 源类,我们需要这个类实现接口  TargetInterface,但这个类不能被改变 
 * 源类与接口之间是没有关系的
 * */
class BeAdapted{
    public void method1(){
        System.out.println("method1");
    }
}

/* 这是适配器,它接受了中已有的接口并产生我们需要的接口  */
class Adapter implements TargetInterface{
    private static BeAdapted adapted;            // 声明一个BeAdapted对象引用
    public Adapter(BeAdapted adapted){        // 构造方法,接收一个BeAdapted引用作为参数
        this.adapted = adapted;
    }
    
    public void method1(){                // method1()在源类BeAdapted中有,这里直接委派
        this.adapted.method1();
    }
    
    public void method2(){                // method2()方法无法通过继承获得,需要自己声明
        System.out.println("method2");
    }
}

Adapter与BeAdapted是委托关系,即为对象适配器模式。

通过使用适配器模式,可以大大提升程序的灵活性以及代码的可重复性。

 

注:笔者在第一次在书上看到策略设计模式和适配器模式时,并没有看懂,感觉云里雾里的,于是去网上找了一下别人的经验贴,其中有一位博主(java_my_life)写的博客十分简明易懂,讲的也很全面,我就是看了他的博客才感觉恍然大悟的,这里贴一下那位博主的两篇博客的地址:

http://www.cnblogs.com/java-my-life/archive/2012/05/10/2491891.html

http://www.cnblogs.com/java-my-life/archive/2012/04/13/2442795.html

文章评论

如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
代码女神横空出世
代码女神横空出世
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
如何成为一名黑客
如何成为一名黑客
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
程序员都该阅读的书
程序员都该阅读的书
Java程序员必看电影
Java程序员必看电影
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
10个调试和排错的小建议
10个调试和排错的小建议
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
我的丈夫是个程序员
我的丈夫是个程序员
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
漫画:程序员的工作
漫画:程序员的工作
程序员必看的十大电影
程序员必看的十大电影
那些争议最大的编程观点
那些争议最大的编程观点
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
中美印日四国程序员比较
中美印日四国程序员比较
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
编程语言是女人
编程语言是女人
总结2014中国互联网十大段子
总结2014中国互联网十大段子
 程序员的样子
程序员的样子
鲜为人知的编程真相
鲜为人知的编程真相
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
程序员应该关注的一些事儿
程序员应该关注的一些事儿
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
老程序员的下场
老程序员的下场
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
旅行,写作,编程
旅行,写作,编程
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
每天工作4小时的程序员
每天工作4小时的程序员
我是如何打败拖延症的
我是如何打败拖延症的
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有