设计模式总结

学一样东西,自己另外举个例子实现一遍,才能知道里面的原理.记录一下学习的几种基本的设计模式

文件结构

几种设计模式的文件结构如下图所示

目录结构图

源代码下载
源码下载

代理模式

说明

这里我举了一个网页渲染时使用代理延迟加载图片的例子,用线程的睡眠模拟延迟加载,hibernate的延迟加载就是用了代理模式实现
代理模式的主要应用:

  1. 远程代理,例如webservice
  2. 虚拟代理,html渲染
  3. 安全代理,控制真实对象的访问权限

spring的AOP就是用的代理模式的思想设计实现的

类图

UML类图

代码

package codeDesign.proxy;
/**
 * Created by kangbiao on 2015/11/22.
 * 网页绘制接口,代理和被代理类均实现该接口
 */
public interface Draw {
    /**
     * 绘制图片,需要花很多时间,使用代理来绘制
     * @param url
     */
    void drawPicture(String url);
}

package codeDesign.proxy;
/**
 * Created by kangbiao on 2015/11/22.
 * 绘制html网页的类(该类会消耗很多时间)
 */
public class HtmlDraw implements Draw{
    /**
     * 该方法不耗时,不需要代理
     * @param text
     */
    public void drawText(String text) {
        System.out.println("正在绘制文字:" + text);
    }
    /**
     * 会消耗一定的时间,需要代理
     * @param url
     */
    @Override
    public void drawPicture(String url) {
        System.out.println("图片区域正在从远程加载图片");
        try {
            Thread.sleep(5000);
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("正在绘制图片:"+url);
    }
}

package codeDesign.proxy;
/**
 * Created by kangbiao on 2015/11/22.
 * 图片绘制代理类
 */
public class ProxyDraw implements Draw {
    HtmlDraw htmlDraw;
    public ProxyDraw(){
        this.htmlDraw=new HtmlDraw();
    }
    @Override
    public void drawPicture(String url) {
        System.out.println("代理先输出一张占位图片");
        new Thread(new Runnable() {
            @Override
            public void run() {
                htmlDraw.drawPicture("1.jpg");
                System.out.println("代理去掉占位图片");
            }
        }).start();
    }
}

package codeDesign.proxy;
/**
 * Created by kangbiao on 2015/11/22.
 * 代理模式测试类
 */
public class ProxyTest {
    /**
     * 该过程演示了网页的绘制过程,使用代理模式异步绘制网页上面的图片
     * @param args
     */
    public static void main(String[] args){
        HtmlDraw htmlDraw=new HtmlDraw();
        htmlDraw.drawText("文字1");
        ProxyDraw proxyDraw=new ProxyDraw();
        proxyDraw.drawPicture("1.jpg");
        htmlDraw.drawText("文字2");
    }
}

工厂模式

说明

最基础的设计模式

类图

工厂模式UML类图

代码

package codeDesign.factory;
/**
 * Created by kangbiao on 2015/11/21.
 *
 */
public class Tea {
    private String sugar;
    public void mixSugarTea(){
        System.out.print("只有"+sugar);
    }
    public String getSugar()
    {
        return sugar;
    }
    public void setSugar(String sugar)
    {
        this.sugar = sugar;
    }
}

package codeDesign.factory;
/**
 * Created by kangbiao on 2015/11/21.
 * 蓝茶
 */
public class BlueTea extends Tea{
    public void mixSugarTea(){
        System.out.print(super.getSugar()+"蓝茶");
    }
}

package codeDesign.factory;
/**
 * Created by kangbiao on 2015/11/21.
 * 红茶
 */
public class BlackTea extends Tea{
    public void mixSugarTea(){
        System.out.print(super.getSugar()+"红茶");
    }
}

package codeDesign.factory;
/**
 * Created by kangbiao on 2015/11/21.
 * 茶的工厂类
 */
public class TeaFactory {
    public static Tea getTea(String teaType){
        Tea tea;
        switch (teaType){
            case "black":
                tea=new BlackTea();
                break;
            case "blue":
                tea=new BlueTea();
                break;
            default:
                tea=new Tea();
                break;
        }
        return tea;
    }
}

package codeDesign.factory;
/**
 * Created by kangbiao on 2015/11/21.
 * 工厂模式测试
 */
public class FactoryTest {
    public static void main(String[] args){
        Tea tea = TeaFactory.getTea("black");
        tea.setSugar("红糖");
        tea.mixSugarTea();
    }
}

装饰器模式

说明

  1. 如果只有一个Concrete Component类而没有抽象的Component接口时,可以让Decorator继承Concrete Component。
  2. 如果只有一个Concrete Decorator类时,可以将Decorator和Concrete Decorator合并。
  3. java的io流包就是使用的装饰器模式

类图

装饰器模式UML类图

代码

package codeDesign.decorator;
/**
 * Created by kangbiao on 2015/11/21.
 * 汽车类
 */
public class Car {
    public void showFunc(){
        System.out.print("组装完毕");
    }
}

package codeDesign.decorator;
/**
 * Created by kangbiao on 2015/11/21.
 * 汽车的功能类
 */
public class Function extends Car{
    protected Car car;
    public void addFuncs(Car car){
        this.car=car;
    }
    public void showFunc(){
        if (car!=null){
            car.showFunc();
        }
    }
}

package codeDesign.decorator;
/**
 * Created by kangbiao on 2015/11/21.
 * 制动功能
 */
public class BrakingFunction extends Function{
    public void showFunc(){
        System.out.print("制动");
        super.showFunc();
    }
}

package codeDesign.decorator;
/**
 * Created by kangbiao on 2015/11/21.
 * ABS防抱死功能
 */
public class ABSFunction extends Function{
    public void showFunc(){
        System.out.print("ABS");
        super.showFunc();
    }
}

package codeDesign.decorator;
/**
 * Created by kangbiao on 2015/11/21.
 * 装饰模式测试
 */
public class DecoratorTest {
    public static void main(String[] args){
        Car car=new Car();
        ABSFunction abs=new ABSFunction();
        BrakingFunction braking=new BrakingFunction();
        abs.addFuncs(car);
        braking.addFuncs(abs);
        braking.showFunc();
    }
}

策略模式

说明

这里我结合了工厂模式,使得加密算法的选择逻辑不用暴露给客户端
Strategy中定义了公共算法的实现接口,然后通过多态在Context动态的创建不同的实现类的实例从而达到算法策略选择逻辑
简化单元测试,因为每一个具体的实现都在一个类里面,可以分开测试
减少了算法调用类和算法实现类之间的耦合

类图

策略模式UML类图

代码

package codeDesign.strategy;
/**
 * Created by kangbiao on 2015/11/21.
 * 加密算法接口
 */
public interface EncryptStrategy {
    /**
     * 加密算法实现接口
     * @param rawString
     * @return
     */
    String doEncrypt(String rawString);
}

package codeDesign.strategy;
/**
 * Created by kangbiao on 2015/11/21.
 * md5加密策略实现类
 */
public class MD5Strategy implements EncryptStrategy{
    @Override
    public String doEncrypt(String rawString) {
        return "MD5("+rawString+")";
    }
}

package codeDesign.strategy;
/**
 * Created by kangbiao on 2015/11/21.
 * SHA1加密实现类
 */
public class SHA1Strategy implements EncryptStrategy {
    @Override
    public String doEncrypt(String rawString) {
        return "SHA1("+rawString+")";
    }
}

package codeDesign.strategy;
/**
 * Created by kangbiao on 2015/11/21.
 * 加密上下文维护类,客户端调用类
 */
public class EncryptContext {
    private EncryptStrategy encryptStrategy;
    public final static byte MD5=0;
    public final static byte SHA1=1;
    /**
     * 这里实现用工厂模式实现自动装载不同的类
     * @param method
     */
    public EncryptContext(Byte method){
        switch (method){
            case MD5:
                this.encryptStrategy=new MD5Strategy();
                break;
            case SHA1:
                this.encryptStrategy=new SHA1Strategy();
                break;
            default:
                break;
        }
    }
    public String doEncrypt(String rawString){
        return encryptStrategy.doEncrypt(rawString);
    }
}

package codeDesign.strategy;
/**
 * Created by kangbiao on 2015/11/21.
 * 策略模式测试类
 */
public class EncryptTest {
    public static void main(String[] args){
        EncryptContext encryptContext=new EncryptContext(EncryptContext.MD5);
        String result=encryptContext.doEncrypt("123456");
        System.out.print(result);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容