深入浅出设计模式学习笔记:一

设计模式

1、定义:是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结

2、优点:代码复用,易于维护,易于理解性,保证代码的可靠性

3、分类:设计模式分为3种类型,共23种模式 

  创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

  结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

  行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

4、软件设计的6大原则:

  1)开闭原则(Open Closed Principle,OCP)

    开闭原则指的是对扩展开放,对修改关闭。

  2) 迪米特法则(最小知识原则)(Principle of Least Knowledge,PLK)

  3)里氏代换原则(Liskov Substitution Principle,LSP)

  4)依赖倒转原则(Dependency Inversion Principle,DIP)

  5)接口隔离原则(Interface Segregation Principle,ISP)

  6)单一职责原则

设计模式背后所秉承的精神所在是很多的设计原则:

1、把会变化的部分取出来并封装起来,以便以后可以轻易的改动或扩充此部分,而不影响不需要变化的其他部分

2、针对接口编程,而不是针对实现编程

3、多用组合,少用继承:组合就是将两个类结合起来使用,使用组合建立系统具有很大的弹性

设计模式:

1、策略模式(Strategy Pattern):策略模式定义了算法族,并将其分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户

组成:

举例说明:鸭子模拟器的设计

  1 /**
  2  * 所有飞行行为必须实现的接口
  3  */
  4 interface FlyBehavior {
  5     public void fly();
  6 }
  7 /**
  8  * 所有呱呱叫行为必须实现的接口
  9  */
 10 interface QuackBehavior {
 11     public void quack();
 12 }
 13 /**
 14  * 飞行行为的具体实现1:可以飞行
 15  */
 16 class FlyWithWings implements FlyBehavior {
 17     @Override
 18     public void fly() {
 19         System.out.println("I am flying!");
 20     }
 21 }
 22 /**
 23  * 飞行行为的具体实现2:不会飞行
 24  */
 25 class FlyNoWay implements FlyBehavior{
 26     @Override
 27     public void fly() {
 28         System.out.println("I can not fly!");
 29     }
 30 }
 31 /**
 32  * 呱呱叫行为的具体实现1:呱呱叫
 33  */
 34 class Quack implements QuackBehavior{
 35
 36     @Override
 37     public void quack() {
 38         System.out.println("Quack");
 39     }
 40 }
 41 /**
 42  * 呱呱叫行为的具体实现2:吱吱叫
 43  */
 44 class Squeak implements QuackBehavior{
 45     @Override
 46     public void quack() {
 47         System.out.println("Squeak");
 48     }
 49 }
 50 /**
 51  * 抽象类,是所有鸭子的超类,在该类中,定义了行为类型接口的引用变量
 52  */
 53 abstract class Duck{
 54
 55     FlyBehavior flyBehavior;
 56     QuackBehavior quackBehavior;
 57
 58     public void setFlyBehavior(FlyBehavior flyBehavior) {
 59         this.flyBehavior = flyBehavior;
 60     }
 61     public void setQuackBehavior(QuackBehavior quackBehavior) {
 62         this.quackBehavior = quackBehavior;
 63     }
 64
 65     public abstract void dispaly();
 66
 67     //将鸭子的行为实现委托给行为类
 68     public void fly(){
 69         flyBehavior.fly();
 70     }
 71
 72     public void quack(){
 73         quackBehavior.quack();
 74     }
 75 }
 76
 77 /**
 78  * 定义model duck子类继承超类duck,并实现超类中的抽象方法
 79  */
 80 class ModelDuck extends Duck{
 81
 82     public ModelDuck(){
 83
 84         flyBehavior = new FlyNoWay();
 85         quackBehavior = new Quack();
 86     }
 87     @Override
 88     public void dispaly() {
 89         System.out.println("I am a model duck!");
 90     }
 91 }
 92 /**
 93  * 测试类
 94  */
 95 public class TestModel{
 96
 97     public static void main(String[] args) {
 98
 99         Duck model = new ModelDuck();
100         model.fly();
101         model.quack();
102         System.out.println("动态更改行为---");
103         //调用鸭子的setter方法,在运行时改变鸭子的行为
104         model.setFlyBehavior(new FlyWithWings());
105         model.setQuackBehavior(new Squeak());
106         model.fly();
107         model.quack();
108
109     }
110
111 }

运行结果:

时间: 2024-10-06 12:41:24

深入浅出设计模式学习笔记:一的相关文章

深入浅出设计模式学习笔记:三

装饰者模式:动态的将责任附加到对象上 Java I/O API也是使用此模式的 装饰模式的类图如下: 抽象组件(Component):抽象类,也可以是接口,规范了动态接收责任的对象. 具体组件(Concrete Component):定义一个将要接收附加责任的类,该组件可以单独使用,或者是被装饰者包装起来使用. 抽象装饰组件(Decorator):抽象类,也可以是接口,拥有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口. 具体装饰组件(Concrete Compon

java/android 设计模式学习笔记(14)---外观模式

这篇博客来介绍外观模式(Facade Pattern),外观模式也称为门面模式,它在开发过程中运用频率非常高,尤其是第三方 SDK 基本很大概率都会使用外观模式.通过一个外观类使得整个子系统只有一个统一的高层的接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节.当然,在我们的开发过程中,外观模式也是我们封装 API 的常用手段,例如网络模块.ImageLoader 模块等.其实我们在开发过程中可能已经使用过很多次外观模式,只是没有从理论层面去了解它. 转载请注明出处:http://bl

java/android 设计模式学习笔记(10)---建造者模式

这篇博客我们来介绍一下建造者模式(Builder Pattern),建造者模式又被称为生成器模式,是创造性模式之一,与工厂方法模式和抽象工厂模式不同,后两者的目的是为了实现多态性,而 Builder 模式的目的则是为了将对象的构建与展示分离.Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程.一个复杂的对象有大量的组成部分,比如汽车它有车轮.方向盘.发动机.以及各种各样的小零件,要将这些部件装配成一辆汽车,这个装配过

java/android 设计模式学习笔记(一)---单例模式

前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使用的时候也会有一些坑. PS:对技术感兴趣的同鞋加群544645972一起交流 设计模式总目录 java/android 设计模式学习笔记目录 特点 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的使用很广泛,比如:线程池(threadpool).缓存(cache).对

java/android 设计模式学习笔记(7)---装饰者模式

这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是继承关系的一种替代方案之一,但比继承更加灵活.在现实生活中也可以看到很多装饰者模式的例子,或者可以大胆的说装饰者模式无处不在,就拿一件东西来说,可以给它披上无数层不一样的外壳,但是这件东西还是这件东西,外壳不过是用来扩展这个东西的功能而已,这就是装饰者模式,装饰者的这个角色也许各不相同但是被装饰的对

大话设计模式学习笔记——面向对象基础

前言 好记性不如烂"笔头"系列--大话设计模式学习笔记 目录 面向对象基础 面向对象基础 什么是类与实例 一切事物皆为对象,即所有的东西老师对象,对象就是可以看到.感觉到.听到.触摸到.尝到.或闻到的东西.准确地说,对象是一个自包含的实体,用一组可识别的特性和行为来标识.面向对象编程,英文叫 Object-Oriented Programming,其实就是针对对象来进行编程的意思.类就是具有相同属性和功能的对象的抽象集合.实例就是一个真实的对象.比如我们属于'人'类,而个人就是'人'类

java/android 设计模式学习笔记(13)---享元模式

这篇我们来介绍一下享元模式(Flyweight Pattern),Flyweight 代表轻量级的意思,享元模式是对象池的一种实现.享元模式用来尽可能减少内存使用量,它适合用于可能存在大量重复对象的场景,缓存可共享的对象,来达到对象共享和避免创建过多对象的效果,这样一来就可以提升性能,避免内存移除和频繁 GC 等. 享元模式的一个经典使用案例是文本系统中图形显示所用的数据结构,一个文本系统能够显示的字符种类就是那么几十上百个,那么就定义这么些基础字符对象,存储每个字符的显示外形和其他的格式化数据

设计模式学习笔记(目录篇)

设计模式学习笔记(目录篇) 为了方便查看,特此将设计模式学习笔记系列单独做一个目录. 1   设计模式学习笔记(一:命令模式) 2   设计模式学习笔记(二:观察者模式) 3   设计模式学习笔记(三:装饰模式) 4   设计模式学习笔记(四:策略模式) 5   设计模式学习笔记(五:适配器模式) 6   设计模式学习笔记(六:责任链模式) 7   设计模式学习笔记(七:外观模式) 8   设计模式学习笔记(八:迭代器模式) 9   设计模式学习笔记(九:中介者模式) 10  设计模式学习笔记(

java/android 设计模式学习笔记(12)---组合模式

这篇我们来介绍一下组合模式(Composite Pattern),它也称为部分整体模式(Part-Whole Pattern),结构型模式之一.组合模式比较简单,它将一组相似的对象看作一个对象处理,并根据一个树状结构来组合对象,然后提供一个统一的方法去访问相应的对象,以此忽略掉对象与对象集合之间的差别.这个最典型的例子就是数据结构中的树了,如果一个节点有子节点,那么它就是枝干节点,如果没有子节点,那么它就是叶子节点,那么怎么把枝干节点和叶子节点统一当作一种对象处理呢?这就需要用到组合模式了. 转