设计模式介绍

面向对象思想设计原则:

1,单一职责原则:高内聚,低耦合。

每个类只有一个职责,对外只能提供一种功能,

引起类发生变化的原因应该只有一个,所有的设计模式都应该遵循这个原则。

2,开闭原则:对扩展开放,对修改关闭。尽量面向抽象或接口编程。

3,里氏替换原则:任何父类出现的地方,都可以拿它的子类对象来替代。

4,依赖注入原则:要依赖于抽象,不要依赖具体实现。

5,接口分离原则:不应该强迫程序依赖它们不需要使用的方法。

也就是一个接口不应该提供太多的行为,一个接口应该只提供一种对外的功能。

6,迪米特原则:一个对象应当对其他对象尽少的了解(低耦合),

降低各对象之间的耦合,提高系统的可维护性,在模块之间面向接口编程,

而不理会模块的内部工作原理,使耦合度降到最低,促进软件的可复用性。

设计模式概述:

--设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、

代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、

保证代码的可靠性。

--设计模式不是一种方法和技术,而是一种思想。

--设计模式和具体的语言无关,学习设计模式就是要建立起面向对象的思想,

尽可能的面向接口编程,低耦合高内聚,使设计的程序可复用。

--学习设计模式能够促进对面向对象思想的理解,反之亦然,它们相辅相成。

设计模式的分类:

创建型模式 : 对象的创建

    --简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式(6个)

 结构型模式:对象的组成(结构)

    --外观模式、适配器模式、代理模式、装饰模式、桥接模式、组合模式、享元模式(7个)

行为型:对象的行为

    --模板方法模式、观察者模式、状态模式、职责链模式、命令模式、访问者模式、

策略模式、备忘录模式、迭代器模式、解释器模式(10个)


    一,单例模式:(保证类在内存中只有一个对象)

    //饿汉式:(不会出问题 jdk6中Runtime类就是典型的饿汉式)

    public class Singleton{

        private static Singleton instance =new Singleton();

        private Singleton(){

        }

        public static Singleton getInstance(){

                return instance;

        }

    }


    //懒汉式:

    //a:体现懒加载思想

    //b:可能会有线程安全问题 所以要加synchronized关键字

    public class Singleton{

        private static Singleton instance=null;

        private Singleton(){

        }

        public static synchronized Singleton getInstance(){

                if(instance==null){

                instance=new Singleton();

                }

                return  instance;

        }

    }

    二,模板设计模式:模板方法模式就是定义一个算法的骨架,

    而将具体的算法延迟到子类中实现。

    public abstract class TemplatePattern {

        //该方法用于计算某算法的运行时间,具体算法由其子类实现

public long getTime(){
long start =System.currentTimeMillis();
method();
long end=System.currentTimeMillis();

return 0;
}


public abstract void method();

}

    三,装饰设计模式:装饰设计模式就是使用被装饰类的一个子类的实例,

    在客户端将这个子类的实例交给装饰类,是继承的替代方案。

    例子:

设计模式介绍

java中装饰设计模式应用的例子:

        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));

        Scanner sc=new Scanner(System.in); //这里只装饰了一次,上面两个装饰了两次