Java设计模式(疯狂Java联盟版)

本文详细介绍了Java设计模式,包括创建型模式(工厂方法、抽象工厂、建造者、单态、原型)、结构型模式(适配器、桥接、组合、装饰、外观、享元、代理)和行为型模式(责任链、命令、解释器、迭代器、中介者、备忘录、观察者、状态、策略、模板方法、访问者)。
摘要由CSDN通过智能技术生成

 

1. 设计模式........................................................................................................................ 3

1.1 创建型模式............................................................................................................ 4

1.1.1 工厂方法...................................................................................................... 4

1.1.2 抽象工厂...................................................................................................... 6

1.1.3 建造者模式................................................................................................ 10

1.1.4 单态模式.................................................................................................... 13

1.1.5 原型模式.................................................................................................... 15

1.2 结构型模式.......................................................................................................... 17

1.2.1 适配器模式................................................................................................ 17

1.2.2 桥接模式.................................................................................................... 19

1.2.3 组合模式.................................................................................................... 23

1.2.4 装饰模式.................................................................................................... 26

1.2.5 外观模式.................................................................................................... 29

1.2.6 享元模式.................................................................................................... 32

1.2.7 代理模式.................................................................................................... 34

1.3 行为型模式.......................................................................................................... 37

1.3.1 责任链模式................................................................................................ 37

1.3.2 命令模式.................................................................................................... 40

1.3.3 解释器模式................................................................................................ 43

1.3.4 迭代器模式................................................................................................ 45

1.3.5 中介者模式................................................................................................ 49

1.3.6 备忘录模式................................................................................................ 52

1.3.7 观察者模式................................................................................................ 54

1.3.8 状态模式.................................................................................................... 58

1.3.9 策略模式.................................................................................................... 61

1.3.10 模板方法.................................................................................................. 63

1.3.11 访问者模式............................................................................................... 65


1. 设计模式(超级详细)

内容简介

 
    有感于设计模式在日常开发中的重要性,同时笔者也自觉对设计模式小有心得,故笔者*写二十三种设计模式的简单例子、
并整理二十三种设计模式的理论部分,综合汇总成这份Java设计模式(疯狂J*va联盟版),希望对大家有所帮助。
        
    本份帮助文档主要是为了向读者介绍二十三种设计模式,包括模式的描述,适用性,模*的组成部分,并附带有简单的例
子和类*,目的是为了让读*了解二十三种*计模式,并能方便的查阅各种设计模*的用法及注意点。
        
    所附的例子非常简单,慢慢的引导读者从浅到深了解设计模式,并能从中享受设计的乐趣。
        
    由于每个人对设计*式的理解都不尽一致,因此,可能本文档的例子*有不恰当的地方,还望各位读者指出不恰当的地方。
欢迎登录疯狂J*va联盟进行技术交流,疯狂Java联盟的论坛宗旨是:
 
    所有的技术发帖,均有回复。
 
    疯狂Java联盟网址:http://www.crazyit.org

笔者简介

    笔者曾师从李刚老师学习Java,现居广州。对Java软件开发、各种Java开源技术都非常感兴趣,曾参与开发、主持*发过大
量Java、Java EE项目,对Java、Java *E项目有一定认识*见解。欢迎大家与笔者就Java、Java EE相*方面进行技术交流。
 
    笔者现为疯狂Jav*联盟的总版主(论坛ID:杨恩雄),也希望通过该平台与大家分享Java、Java EE技术、*得。
 
    本人邮箱:yangenxiong@163.com          

声明

    本文档编写、制作过程中得到了疯狂Java联盟、以及笔者学习工作过程大量朋友的支持,大家都抱着一个目的:为国内软件
软件开发事业作出绵薄贡献。
    我们在此郑重宣布,本*档遵循Apache 2.0协议。在完整保留全部文本(包括本版权页),并且不违反Apache 2.0协议的前提
下,允许和鼓励任何人进行全文转载及推广,我们放弃除署名权外的一切权利。

1.1 创建型模式

AbstractFactory ( 抽象工厂 )

FactoryMethod ( 工厂方法 )

Singleton ( 单态模式 )

Builder ( 建造者模式 )

Protot*pe * 原型模式 )

1.1.1 工厂方法

 
    *义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例*延迟到其子类。

 适用性

 
    1.当一个类不知道它所必须创建的对象的类的时候。
 
    2.当一个类希望由它的子类来指定它所创建的对象的时候。
 
    3.当*将创建对象的职责委托给多个帮助*类中的某一个,并且*希望将哪一个帮助子类是代理者这一信息局部化的时候。
                        

 参与者

 
    1.Product
      定义工厂方法所创建的对象的接口。
 
    2.ConcreteProduct
      实现Product接口。
 
    3.Creator
      声明工厂方法,该方法返回一个Product类型的对象*
      Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的ConcreteProduct对象。
      可以调用工厂方法以创建一个Product对象。
 
    4.ConcreteCreator
      重定义工厂方法以返回一个ConcreteProduct实例。

 类图

 例子

*roduct

 
public interface Work {
 
 
    void doWork();
}

ConcreteProduct

 
public class StudentWork implements Work {
 
 
    public void doWork() {
 
        System.out.println("学生*作业!");
    }
 
}
 
public class TeacherWork implements Work {
 
 
    public void doWork() {
 
        System.out.println("老师审批作业!");
    }
 
}

Creator

 
public interface IWorkFactory {
 
 
    Work get*ork();
}

Concre*eCreator

 
pu*lic class StudentWorkFactory implements IWorkFactory {
 
 
    public Work getWork() {
 
        *eturn new StudentWork();
    }
 
}
 
public class TeacherWorkFactory implements IWorkFactory {
 
 
    public Work getWork() {
 
        return new TeacherWork();
    }
 
}

Test

 
public class Test {
 
 
    public static void m*in(Strin*[] args) {
 
        IWorkFactory studentWorkFactory = new StudentWorkFactory();
        studentWorkFactory.getWork().d*Work();
        
        IWorkFactory teacherWorkFactory * new TeacherWorkFactory();
        teacherWorkFactory.g*tWork().*oWork();
    }
 
}

result

 
学生做作业!
老师审批作业!

1.1.2 抽象工厂

 
    提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

 适用性

 
    1.一个系统要独立于它的*品的创建、组合和表示时。
 
    2.一个系统要由多个产品系列中的一个来配置时。
 
    3.当你要强调一系列相关的产品对象的设计以便进行联合使用时*
 
    4*当你提供一个产品类库,而只想显示它们*接口而不是实现时。
                        

 参与者

 
    1.Ab*tractFactory
      声明一个创建抽象产品对象的操作接口。
 
    2.ConcreteFactory
      实现创建具体产品对象的操作。
 
    *.AbstractProduct
      为一类产品对象声明一个接口。
 
    4.ConcreteProdu*t
      定义一个将被相应的具体工厂创建的产品*象。
      实现*bstractProduct接口。
 
    5.Client
      仅使用由AbstractFactory和AbstractProduc*类声明的接口

 类图

 例子

*bstractFactory

 
public interface IAn*malFactory {
 
 
    ICat createCat();
        
    IDog cre*teDog();
}

ConcreteFactory

 
p*blic class BlackAnimalFactory implem*nts IAnimalFactory {
 
 
    public ICat createCat() {
 
        retur* new BlackCat();
    }
 
    public IDog createDog() {
 
        return new BlackDog();
    }
 
}
 
public class WhiteAnimalFac*ory imp*ements IAnimalFactory {
 
 
    public ICat createCat() {
 
        return new WhiteCat();
    }
 
    public IDog cre*teDog() {
 
        return new WhiteDog();
    }
 
}

Abstrac*Product

 
public interface ICat {
 
 
    void eat();
}
 
public interface IDog {
 
 
    void eat();
}

Concrete*roduct

 
public class Black*at implements ICat {
 
 
    public void eat() {
 
        System.out.println("The bl*ck cat is eating!");
    }
 
}
 
public class WhiteCat implements *Cat {
 
 
    public void eat() {
 
        Sy*tem.out.prin*ln("The w*ite cat is eating!*);
    }
 
}
 
public class BlackDog implements IDog {
 
 
    public void eat() {
 
        System.out.println("The black dog is eating");
    }
 
}
 
public class WhiteDog implements IDog {
 
 
    public void eat() {
 
        System.out.println("The white dog is eat*ng!");
    }
 
}

Client

 
public static void main(String[] args) {
 
    IAnimalFactory blackAnimalFa*tory = new BlackAnimalFactory();
    ICat blackCat = blackAnimalFactory.createCat();
    blackCat.eat();
    IDog blackD*g = blackAnimalFactory.createDog();
    blackDog.eat();
    
    IAnimalFactory whiteAnimalF*ctory = new WhiteAnimalFactory();
    ICat whiteCat = whiteAnimalFactory.createCat();
    whiteCat.eat();
    IDog *hiteDog = whiteAnimalFactory.createDog();
    whiteDog.eat();
}

res*lt

 
The bla*k cat is eating!
Th* black dog is eatin*!
The white cat is eating!
The white dog is *ating!

1.1.3 建造者模式

 
    将一个复杂对象的构*与它的表示分离,使*同样的构建过程可以创建不同的表示。

 适用性

 
    1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
 
    *.当构造过程必须允*被构造的对象有不同*表示时。
                        

 参与者

 
    1.Builder
      为创建一个Product对象的各个部件指定抽象接口。
 
    2.ConcreteBuilder
      实现Buil*er的接口以构造和装配该产品的各个部件。
      定义并明确它所创建的表示*
      提供一个检索产品的接口。
 
    3.Director
      构造一个使用Builder接口的对象。
 
    4.Product
      表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。
      包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

 类图

 例子

Buil*er

 
public interface PersonBuilder {
 
 
    void buildHead();
    
    v*id buildBody();
    
    void buildFoot()*
 
    Person buildPerson();
}

ConcreteBuilder

 
public class ManBuilder implements PersonB*ilder {
 
 
    Person person;
    
    public ManBuilder() {
 
        person = ne* Man();
    }
    
    publ*c void build*ody() {
 
        perso*.setBody("建造男人的身体");
    }
 
    public void buildFoot() {
 
        person.setFo*t("建造男人的脚");
    }
 
    public void buildHead() {
 
        pers*n.setHead("建造*人的头");
    }
 
    *ublic Person buildPerson() {
 
        retur* person;
    }
}

Dir*ctor

 
public class PersonDirec*or {
 
 
    public Person constructPerson(PersonBuilder pb) {
 
        pb.buildHead();
        pb.buildBody();
        pb.buildFoot();
        return pb.buildPerson();
    }
}

Product

 
public class Person {
 
 
    private String head;
    
    private String body;
    
    private String foot;
 
    public String getH*ad() {
 
        return head;
    }
 
    public void setHead(String hea*) {
 
        this.head = head;
    }
 
    public String getBody() {
 
        return body;
    }
 
    public void setBody(String body) {
 
        this.b*dy = body;
    }
 
    public String getFoot() {
 
        return foot;
    }
 
    public void setFoot(String foot) {
 
        t*is.foot = foot;
    }
}
 
public class Man extends Person {
 
 
}

Test

 
publ*c class Test{
 
    
    public static void main(String[] ar*s) {
 
        PersonDirector pd = new PersonDirector();
        Person person = pd.constructPerson(new ManBuilder());
        System*out.println(person.getBody());
        System.out.println(person.getFoot());
        System.out.println(person.getHead());
    }
}

result

 
建造男人*身体
建造男*的脚
建造男人的头

1.1.4 单态模式

 
    保证一个类仅有一个实例,*提供一个访问它的全局访*点。

 适用性

 
    1.当类只能有一个*例而且客户可以从一个众所周知的访问点访问它时。
 
    2.当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
                        

 参与者

 
    Singleton
      定义一个Instance操作,允许客户访问它的唯一实例。Instance是一个类操作。
      可能负*创建它自己的唯一实例。

 类图

 

 例子

Singleton

 
public class Singleton {
 
    
    privat
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1) 优秀的程序应该是这样的:阅读时,感觉很优雅;新增功能时,感觉很轻松;运行时,感觉很快速,这就需要设计模式支撑。2) 设计模式包含了大量的编程思想,讲授和真正掌握并不容易,网上的设计模式课程不少,大多讲解的比较晦涩,没有真实的应用场景和框架源码支撑,学习后,只知其形,不知其神。就会造成这样结果: 知道各种设计模式,但是不知道怎么使用到真实项目。本课程针对上述问题,有针对性的进行了升级 (1) 授课方式采用 图解+框架源码分析的方式,让课程生动有趣好理解 (2) 系统全面的讲解了设计模式,包括 设计模式七大原则、UML类图-类的六大关系、23种设计模式及其分类,比如 单例模式的8种实现方式、工厂模式的3种实现方式、适配器模式的3种实现、代理模式的3种方式、深拷贝等3) 如果你想写出规范、漂亮的程序,就花时间来学习下设计模式吧课程内容和目标本课程是使用Java来讲解设计模式,考虑到设计模式比较抽象,授课采用 图解+框架源码分析的方式1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和实现、类的关联、聚合和组合) 23种设计模式包括:创建型模式:单例模式(8种实现)、抽象工厂模式、原型模式、建造者模式、工厂模式。结构型模式:适配器模式(3种实现)、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式(3种实现)。行为型模式:模方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)2) 学习目标:通过学习,学员能掌握主流设计模式,规范编程风格,提高优化程序结构和效率的能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值