Java设计模式学习(一)

来源:互联网 发布:js正则表达式 i 编辑:程序博客网 时间:2024/06/06 13:16

一  接口与抽象类

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 依赖倒转原则的优缺点

0 0
原创粉丝点击