黑马程序员--Java设计模式学习(一)
2014-02-11 16:15
260 查看
------- android培训、java培训、期待与您交流! ----------
如 java.lang.Runnable 就是一个java接口
Public interfance Runnable{
public abstract void run();
}
接口是对可插入性的保证,在java中,类只允许有一个父类,只可有一个继承关系,而接口则保证了java的插入性变的可能。
标识接口: 没有任何方法和属性的接口,仅仅表明实现它的类属于一个特定的类型,通用与工具类中
如 java.io.Serializable 接口 , java.rmi.Remote接口
常量接口 : 此方法不予推荐
抽象类应当拥有尽可能少的数据
正确使用原则 ---参照 组合/聚合复用原则(CARP) m
模板方法模式
换言之,一个软件实体如果使用的是一个基类的话,那么一定适用于其子类,而且它根本不能察觉出基类对象和子类对象的区别。
里氏代换原则是继续复用的基石。只有当衍生类可以低缓掉基类,软件单位的功能不会受到影响时,基类才能被真正复用,而衍生类也才能够在基类的基础上增加新的行为
反之不成立
合成模式:
代理模式:
例: 正方形属于长方形的子类么
我们知道当长方形的长=宽时 就构成了正方形 因此很多人自然而然的认为 正方形可以是长方形的子类 然而事实真是这样子么?
如上两个类 发现如果真将 Square 类继承了Rectangle,那么在传递width 和height 同样也会发生变化 这明显不是正确的父子类关系,如果真要有个父类不如直接将长方形和正方形的共同点抽象出来 比如 做一个四边形的类(Quadrangle)
看此类 没有赋值的方法,这样不管你如何赋值,都不会破坏本身四边形Quadrangle这个接口,从而也不会破坏里氏代换原则
然后分别将长方形和正方形去继承此类.
java.utile.Properties 与 java.util.Properties的关系符合里氏代换原则么?
1.1 为什么需要依赖倒转原则 依赖倒转原则是 COM CORBA JaveBean 以及EJB等架构设计模式背后的基本原则
具体耦合 一般是一个具体类引用另外一个具体类
抽象耦合 一个具体类和一个抽象类或者接口之间
细节应当依赖于抽象,抽象不应当依赖于细节 ---- 要针对接口编程,不要针对实现编程
引用对象的抽象类型--》 List ls = new Vector() 不推荐 Vector v = new Vector();
对象的创建
2.1 工厂方法模式
2.2 模板方法模式
2.3 迭代子模式
3.1 java对抽象类的支持
3.2 例 账号,账号的种类和账号的状态
3.3 依赖倒转原则的优缺点
一 接口与抽象类
1.1接口定义:
人们所讲的接口一般有2种含义:一种是java接口,这是一种java语言中存在的结构,有着特定的语法和结构,二种是指一个类所具有的方法的特征集合,是一种逻辑上的抽象。前者叫做“java接口”,后者就叫做“接口”。如 java.lang.Runnable 就是一个java接口
Public interfance Runnable{
public abstract void run();
}
接口是对可插入性的保证,在java中,类只允许有一个父类,只可有一个继承关系,而接口则保证了java的插入性变的可能。
1.2Java 接口常见的用法
单方法接口: 如 Runnable 只有一个 run方法 无返回值,ActionListener 也只有一个actionPerformed()方法标识接口: 没有任何方法和属性的接口,仅仅表明实现它的类属于一个特定的类型,通用与工具类中
如 java.io.Serializable 接口 , java.rmi.Remote接口
常量接口 : 此方法不予推荐
2.1 抽象类定义:抽象类仅提供一个类型的部分实现,抽象类可以有实例变量,以及一个或多个构造子,可以同时拥有抽象方法和具体方法
2.2 抽象类的用途:
抽象类应当拥有尽可能多的共同代码抽象类应当拥有尽可能少的数据
2.3 基于抽象类的模式和原则
针对抽象编程 ---参照 依赖倒转原则(DIP)正确使用原则 ---参照 组合/聚合复用原则(CARP) m
模板方法模式
二、里氏代换原则(LSP)
如果对每一个类型为t1的对象o1,都有类型为t2的对象o2,使得以t1定义的所有程序p在所有对象o1都代换成o2时,程序p的行为没有发生变化,那么类型t2是类型t1的子类型。换言之,一个软件实体如果使用的是一个基类的话,那么一定适用于其子类,而且它根本不能察觉出基类对象和子类对象的区别。
里氏代换原则是继续复用的基石。只有当衍生类可以低缓掉基类,软件单位的功能不会受到影响时,基类才能被真正复用,而衍生类也才能够在基类的基础上增加新的行为
反之不成立
1.1里氏代换原则在设计模式中的体现
策略模式 : 如果有一组算法,那么就将每一个算法封装起来,使得他们可以互换合成模式:
代理模式:
例: 正方形属于长方形的子类么
我们知道当长方形的长=宽时 就构成了正方形 因此很多人自然而然的认为 正方形可以是长方形的子类 然而事实真是这样子么?
public Rectangle{ private long width; private long height; /**.....get().set()..*/ } public Square{ private long side; /**.....get().set()..*/ }
如上两个类 发现如果真将 Square 类继承了Rectangle,那么在传递width 和height 同样也会发生变化 这明显不是正确的父子类关系,如果真要有个父类不如直接将长方形和正方形的共同点抽象出来 比如 做一个四边形的类(Quadrangle)
public interface Quadrangle(){ public long getWidth(); public long getHeight(); }
看此类 没有赋值的方法,这样不管你如何赋值,都不会破坏本身四边形Quadrangle这个接口,从而也不会破坏里氏代换原则
然后分别将长方形和正方形去继承此类.
java.utile.Properties 与 java.util.Properties的关系符合里氏代换原则么?
三、依赖倒转原则(DIP) 要依赖于抽象,不要依赖于具体
1.1 为什么需要依赖倒转原则 依赖倒转原则是 COM CORBA JaveBean 以及EJB等架构设计模式背后的基本原则
1.2 复用与可维护性的倒转
1.3 依赖倒转原则
三种耦合关系 零耦合具体耦合 一般是一个具体类引用另外一个具体类
抽象耦合 一个具体类和一个抽象类或者接口之间
细节应当依赖于抽象,抽象不应当依赖于细节 ---- 要针对接口编程,不要针对实现编程
引用对象的抽象类型--》 List ls = new Vector() 不推荐 Vector v = new Vector();
对象的创建
2.1 工厂方法模式
2.2 模板方法模式
2.3 迭代子模式
3.1 java对抽象类的支持
3.2 例 账号,账号的种类和账号的状态
3.3 依赖倒转原则的优缺点
相关文章推荐
- 黑马程序员java学习第六天,static静态的使用及单例设计模式
- 黑马程序员——Java学习之“浮”谈设计模式
- 黑马程序员------java学习笔记之单例设计模式
- 黑马程序员 JAVA学习笔记——java基础 单例设计模式
- 黑马程序员-Java学习笔记之设计模式(单例设计模式,装饰设计模式,模板设计模式)
- 黑马程序员_java基础学习笔记之单例设计模式
- 【黑马程序员】Java基础学习博客——两种设计模式
- 黑马程序员-JAVA学习之装饰设计模式与自定义BufferedReader
- 黑马程序员--Java基础学习笔记【单例设计模式、网络编程、反射】
- 黑马程序员 【】java学习之路——单例设计模式简介
- 黑马程序员--Java学习11--设计模式
- 黑马程序员—java基础学习--单例设计模式
- 黑马程序员——学习Java基础之 io LineNumberReader 之装饰设计模式
- 黑马程序员 java学习笔记3-IO流之字节流与装饰设计模式
- 黑马程序员 学习笔记——Java 二十三设计模式之单例
- 黑马程序员——Java学习笔记之12——已接触的“设计模式”总结
- 【Java23种设计模式学习笔记】一:策略模式
- java设计模式之命令模式 学习笔记
- 黑马程序员 学习笔记四: 单例设计模式
- 黑马程序员———java 单例设计模式