设计模式详解
介绍23种设计模式,用java实现例子,都可以直接运行。简单易懂
万明智
这个作者很懒,什么都没留下…
展开
-
面向对象的23种设计模式
首先呢,设计模式是针对面向对象来的。再说设计模式之前我们先来说一下六大设计原则。 首先最基础的开闭原则:对扩展开放,对修改关闭。 为啥这是最基础的,因为我们都知道软件是要改的。对扩展开放保证了可以增加功能,像泛型啦这些。对修改关闭保证了像前的兼容性,jdk7兼容jdk6这样。所以开闭原则围绕软件的整个生命周期。在说其余五个之前我先说一下程序设计的模块内高内聚,模块间低耦合,其实把类看成一个模块,结原创 2017-08-16 15:42:34 · 10314 阅读 · 0 评论 -
六种线程安全的单例模式
单例模式怕是很多程序员使用最多的设计模式了,面向对象的23种设计模式点这里。废话不多说,直接上代码:public class Singleton { //1.懒汉型 private static Singleton instance; private Singleton (){} public static synchronized Singleton g...原创 2017-08-16 18:31:34 · 5632 阅读 · 2 评论 -
原型模式的深浅复制和序列化
这是java的Object直接有方法的设计模式,面向对象的23种设计模式点这里。我们要做的只是实现Cloneable接口,这个接口的目的只是告诉jvm这个类的对象可以clone。同样的还有Serializable接口,今天说的跟它也有关系。下面回到题目,复制和clone相信大家都知道。就是弄个一模一样的,而那个模子就叫原型。那么什么是深复制和浅复制呢?这和对象实现有关系,对象里的属性有基本类型和引用原创 2017-08-17 15:19:24 · 2134 阅读 · 0 评论 -
工厂方法模式
我们在看一些源码时经常会看到xxxxFactory,这就是工厂模式了。面向对象的23种设计模式点这里。说工厂模式之前先说个段子:有个单身的java程序员,过年回家晚上睡着了。父母看着独生的儿子就着急说“你看也不小了,这没有对象怎么办”,程序员在梦中“随便new 一个”。这个怕是不好new,所以我们要找今天的婚姻介绍所:工厂模式。废话不说,代码伺候:public class Factory {//简单原创 2017-08-18 17:27:29 · 2001 阅读 · 0 评论 -
抽象工厂模式
上一篇写了简单工厂和工厂方法,简单工厂和工厂方法点这里,面向对象的23种设计模式点这里。我们还用上词美女的例子,直接上代码:public class Factory {//抽象工厂模式,还是一个类。觉得适合看的人拷过去运行修改 abstract static class 美女 { 身材 身材;//这里为了简单,我们感兴趣的只是身材 void 美女(){原创 2017-08-21 14:13:05 · 1677 阅读 · 0 评论 -
建造者模式
建造者模式使用的也是比较多的设计模式,public class Computer { private String cpu; private String screen; private String disk; private Computer() { } @Override public String toString() {原创 2017-08-22 10:15:28 · 1654 阅读 · 0 评论 -
两种适配器模式
说到适配器,我想我们接触最多的叫电源适配器。没错,所有的手机充电器都是电源适配器。从交流变直流,从220v到5v。而适配器模式分为两种,一种是类适配器,一种是对象适配器。下面先写类适配器:public class Adapter { static class HomePower { public String homeRequest() {原创 2017-08-24 18:08:11 · 1958 阅读 · 0 评论 -
装饰器模式
装饰器模式,听名字就知道是在原来的上面加点东西,面向对象的23种设计模式点这里。废话少说,我们把圆球图上颜色。上代码:public class Decorator { public interface Color {//颜色接口,可返回任意颜色 String draw(); } public static class RedColor implements Co原创 2017-08-30 16:15:28 · 1722 阅读 · 0 评论 -
代理模式
代理模式和装饰器模式实现起来很像,那他们的区别在哪呢。我喜欢从名字上分析,装饰只是加点东西,而代理是全权的。所以装饰改的是一个接口的方法(当然装饰可以嵌套),而代理是所有的方法(当然java动态代理只能更改有接口的)。代理分为静态代理和动态代理,下面上静态代理代码:public class Proxy { interface Draw { String draw();原创 2017-09-01 17:20:45 · 1519 阅读 · 0 评论 -
外观模式
这个是比较好理解的,拿我们的电脑做例子。电脑有cpu,内存,显卡等这些。当电脑开机时,主板、cpu、内存等都要启动。但作为用户并不需要管里面启动顺序之类的,我们只要按下开机键就行了。public class Facade { public static class Board { public void start(){ System.out.print原创 2017-09-04 15:21:10 · 1495 阅读 · 0 评论 -
桥接模式
因为这个模式网上有很多不恰当的例子,这里先引用百度百科的定义:桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。 所以说桥接模式就是接口模式,一方调用接口,一方实现接口。还是百度上的示例代码:public class Abstraction{/* Fields */原创 2017-09-11 20:18:16 · 1537 阅读 · 0 评论 -
享元模式
享元模式听名字就知道是共享一个东西,为了节省内存嘛。那么它和单例模式有什么不同呢?单利模式就一个对象,而享元模式是一组对象,共享的是相同的对象。没错,我们的String就用的享元模式,下面我们代码实现:public abstract class Flyweight{ public abstract void operation(); } public class Concre原创 2017-09-11 20:34:41 · 1504 阅读 · 0 评论 -
组合模式
这里的组合模式不是”组合好于继承”的组合,那么是什么组合呢,我们来看代码:abstract class Component { String name; public Component(String s){ this.name=s; } public abstract void add(Component c);原创 2017-09-11 21:06:58 · 1518 阅读 · 0 评论 -
策略模式与机制
在说策略模式之前,我们首先要说下Unix/Linux的接口设计有一句通用“提供机制而不是策略”的格言。 什么是策略,策略有点像战术是具体的东西。而机制像战略是目的。 通俗来说机制是做什么,策略是怎么做。public class Strategy { // 抽象策略 interface EatStrategy { void eatFood(); } s原创 2017-09-21 13:38:59 · 2987 阅读 · 0 评论 -
模板方法模式
我们做一些事情都有一个步骤,而相似事的步骤是一致的。就拿我们打10086来说,有人查余额和有人要人工服务,但他们的不知都分下面三步:拨号、选择服务、评分。这种最适合用模板方法,实现如下:public class TemplateMethod { //模板抽象方法 public abstract static class Template10086 { //1.拨打10原创 2017-09-21 15:11:25 · 1456 阅读 · 0 评论 -
观察者模式与回调
在说观察者模式之前,我们来说一下回调函数。如小明想找小丽看电影,小丽不在家。小丽妈妈接的电话,于是小明说小丽到家了告诉他。实现如下:public class Observer { public interface Watcher { public void update(); } public static class 小丽妈妈{ private原创 2017-09-21 16:49:24 · 2926 阅读 · 0 评论 -
迭代器模式
迭代模式就是提供一种遍历方式,像list、set等都实现了迭代模式。我们下面实现对String字符的遍历:public class MyIterator { interface iterator { Object next(); boolean hasNext(); } static class MyString implements iterat原创 2017-09-25 09:00:08 · 1429 阅读 · 0 评论 -
责任链模式
说责任链之前,我们先来说责任。责任就是一件事情由谁处理,出了问题由谁负责。无论公司还是政府,都是层层管理的,上面不处理就交给下面。就形成了一个责任链条, 现在的触屏设备的点击事件也是一样。一般都采用责任链模式,大控件不处理就转给小控件。代码如下:public class ResponsibilityChain { public static abstract class Widget {原创 2017-09-25 11:36:19 · 1548 阅读 · 0 评论 -
命令模式
命令,我们知道有命令、命令者、和被命令者。代码如下:public class Command { //命令模式 本来很简单的一句话的事为啥要整个模式,这个模式最主要的是命令者和被命令者的分离 public interface command {//命令接口 void exe(); } public static class MyCommand imple原创 2017-09-28 18:28:36 · 1495 阅读 · 0 评论 -
备忘录模式
备忘录模式也叫快照模式。在我们使用画图或ppt等办公软件时,常要撤销一些操作,这也是这个模式存在的最主要原因。代码如下:public class Memento {//这个模式为了恢复到以前的某个状态 static class Originator { private String state = ""; public String getState() {原创 2017-10-13 16:24:34 · 1761 阅读 · 0 评论 -
状态模式
生活中大部分东西都用容易变的和不容易变的,容易变的我们叫这个东西处于某种状态。比如人睡觉时你不要吵醒他。有时候某种状态影响对象整个的外部表现:像水和冰给人感觉就不是一个东西了,这时候我们就可以用状态模式了:public class State { public interface IWaterState { void printState(); } public s原创 2017-10-13 16:34:05 · 1485 阅读 · 0 评论 -
访问者模式
访问者模式,很多人认为是最难的一种设计模式。我觉得是名字没起好。我们先换个名字,不如叫它读者模式,我们知道一千个读者有一千个哈姆雷特。也就是说同一个对象,不同的读者会有不同的操作。代码如下:public class Visitor { abstract static class Element {//抽象的书 public abstract void accept(IVisi原创 2017-10-17 10:26:25 · 1730 阅读 · 0 评论 -
中介者模式
中间人模式也叫中介模式,听名字就应该知道的差不多了。下面例子中张三李四中间就有个中间人,代码如下:public abstract class Mediator { public abstract void contact(String content, String name); public static class Colleague { protected Str原创 2017-10-17 15:34:18 · 1703 阅读 · 0 评论 -
解释器模式
这是设计模式最后一篇,迟迟没有写。听到这个名字可能会想到解释型语言,学习编译倒也可以参考一下这个。这个在实际工作中用的很少,直接上实现加减乘除的代码吧public class Interpreter { interface Expression { int interpret(Context context); } //终结符表达式(Terminal Expre原创 2017-11-01 10:32:07 · 1727 阅读 · 0 评论