JavaSe——设计模式
来源:互联网 发布:mysql数据库免费吗 编辑:程序博客网 时间:2024/05/18 03:00
A.模块设计模式
GetTime类:
package com.core.module;public abstract class GetTime {public long getTime() {long begin = System.currentTimeMillis();code();long end = System.currentTimeMillis();return end - begin;}abstract void code();}
输出的类:
package com.core.module;public class OutDemo extends GetTime {@Overridevoid code() {for (int i = 0; i < 10000; i++) {System.out.println(i);}}}复制的类:
package com.core.module;public class IODemo extends GetTime {@Overridevoid code() {try {Thread.sleep(3000);//假设是在复制...} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
测试类:
package com.core.module;public class TestDemo {/** * @param args */public static void main(String[] args) {//输出的耗时OutDemo outDemo = new OutDemo();long time = outDemo.getTime();System.out.println("输出耗时:"+time);//拷贝的耗时IODemo ioDemo = new IODemo();long time2 = ioDemo.getTime();System.out.println("拷贝耗时:"+time2);}}
B.装饰设计模式
手机添加新功能
1:继承版
2:装饰模式版
最后说说IO中的装饰模式应用
package com.core.decorate;public interface Phone {public abstract void call();}
Iphone类:
package com.core.decorate;public class IPhone implements Phone {@Overridepublic void call() {System.out.println("手机可以打电话");}}
Phone装饰类:
package com.core.decorate;public abstract class PhoneDecorate implements Phone {private Phone p;public PhoneDecorate(Phone p){this.p = p;}@Overridepublic void call() {this.p.call();}}
彩铃类:
package com.core.decorate;public class RingPhoneDecorate extends PhoneDecorate {public RingPhoneDecorate(Phone p) {super(p);}@Overridepublic void call() {System.out.println("手机可以听彩铃");super.call();}}
音乐类:
package com.core.decorate;public class MusicPhoneDecorate extends PhoneDecorate {public MusicPhoneDecorate(Phone p) {super(p);}@Overridepublic void call() {super.call();System.out.println("手机可以听音乐了");}}
测试类:
package com.core.decorate;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.InputStreamReader;import java.io.OutputStreamWriter;public class TestDemo {/** * @param args */public static void main(String[] args) {IPhone phone = new IPhone();phone.call();System.out.println("---");//给手机添加彩铃功能,接电话前RingPhoneDecorate rp = new RingPhoneDecorate(phone);rp.call();System.out.println("---");//接电话之后,可以听音乐MusicPhoneDecorate mp = new MusicPhoneDecorate(phone);mp.call();System.out.println("---");//新需求:在接电话前,听彩铃,电话后,听音乐MusicPhoneDecorate newPhone = new MusicPhoneDecorate(new RingPhoneDecorate(phone));newPhone.call();System.out.println("---");RingPhoneDecorate newPhone2 = new RingPhoneDecorate(new MusicPhoneDecorate(phone));newPhone2.call();//IO流的应用BufferedReader br = new BufferedReader(new InputStreamReader(System.in));BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));}}
更详细的参看这里: http://jiangnanlove.iteye.com/blog/914120
刚好看了个视频 关于装饰设计模式 觉得挺精辟的就保留了下来
什么是装饰设计模式:
当想要对已有的对象进行功能增强时,
可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。
那么自定义的该类称为装饰类。
装饰类通常会通过构造方法接收被装饰的对象。
并基于被装饰的对象的功能,提供更强的功能。
如一个简单的demo 人吃饭,刚开始人穷只是普通的吃饭后来人生活好了吃饭就不一样了增强了吃饭的功能 虽然例子不是恰当 能说明问题就行
看代码:
//穷的时候吃饭简简单单的吃饭class Person{public void chiFan(){System.out.println("吃饭");}}//富裕后吃饭 吃饭前来杯酒吃饭后来根烟 但是这中间的过程还是有吃饭class SuperPerson{private Person p;public SuperPerson(Person p){this.p=p;}public void superChiFan(){//吃饭前来杯开胃酒增加食量System.out.println("开胃酒");p.chiFan();//吃完饭后来根烟System.out.println("来根烟");}}public class PersonDemo{public static void main(String args[]){Person p=new Person();SuperPerson sp= new SuperPerson(p);sp.superChiFan();}}
以上只是简单说明一下,在JAVA IO中用了很多增强 如:FileRead中read()方法 只是一个一个字节去读,为了读得更快在BufferedReader就增强了read()方法而产生了reandLine()一行一行的去读
有人说没必要那么麻烦:你只要拿superPerson继承person 在覆写person的chiFan()方法不就行了?
装饰是构造函数参数传递进行增强
如果为了某个功能而产生子类(继承)那么那个体系是非常臃肿的
例如:你有个对象有个功能 是在N年前建立的,如今你觉得功能不够用了 写个类把对象传进来就可以解决问题了 如果这个功能写错了 我就把自己写的功能去掉又不影响以前的功能灵活性相当强的。
装饰模式比继承要灵活。避免了继承体系臃肿。
而且降低了类于类之间的关系。
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。
所以装饰类和被装饰类通常是都属于一个体系中的。
C.简单工厂设计模式
l 简单工厂模式概述
• 又叫静态工厂方法模式,它定义一个具体的工厂类负责创建一些类的实例
l 优点
• 客户端不需要在负责对象的创建,从而明确了各个类的职责
l 缺点
• 这个静态工厂类负责所有对象的创建,如果有新的对象增加,或者某些对象的创建方式不同,就需要不断的修改工厂类,不利于后期的维护
Animal抽象类:package com.core.module.demo;public abstract class Animal {abstract void eat();}Cat类:
package com.core.module.demo;public class Cat extends Animal {@Overridevoid eat() {System.out.println("猫吃鱼");}}Dog类:
package com.core.module.demo;public class Dog extends Animal {@Overridevoid eat() {System.out.println("狗吃骨头");}}工厂类:
package com.core.module.demo;public class AnimalFactory {//私有化构造方法private AnimalFactory() {}public static Animal createDog(){return new Dog();}public static Animal createCat(){return new Cat();}//工厂改进public static Animal createAnimal(String type){if("dog".equals(type)){return new Dog();}else if("cat".equals(type)){return new Cat();}else{return null;}}}
测试类:
package com.core.module.demo;public class Test {public static void main(String[] args) {// 基本的方式Dog dog = new Dog();Cat cat = new Cat();dog.eat();cat.eat();// 使用工厂类System.out.println("--------");Animal dog2 = AnimalFactory.createDog();Animal cat2 = AnimalFactory.createCat();dog2.eat();cat2.eat();//工厂改进之后System.out.println("--------");Animal dog3 = AnimalFactory.createAnimal("dog");Animal cat3 = AnimalFactory.createAnimal("cat");dog3.eat();cat3.eat();}}
D.工厂方法设计模式
动物抽象类:publicabstract Animal { public abstract void eat(); }
工厂接口:publicinterface Factory {public abstract AnimalcreateAnimal();}
具体狗类:publicclass Dog extends Animal {}
具体猫类:publicclass Cat extends Animal {}
开始,在测试类中每个具体的内容自己创建对象,但是,创建对象的工作如果比较麻烦,就需要有人专门做这个事情,所以就知道了一个专门的类来创建对象。发现每次修改代码太麻烦,用工厂方法改进,针对每一个具体的实现提供一个具体工厂。
狗工厂:publicclassDogFactoryimplements Factory {
public Animal createAnimal(){…}
}
猫工厂:publicclassCatFactoryimplements Factory {
public Animal createAnimal(){…}
}
package com.core.module.demo2;public interface Factory {public abstract Animal createAnimal();}
狗工厂:
package com.core.module.demo2;public class DogFactory implements Factory {@Overridepublic Animal createAnimal() {return new Dog();}}
猫工厂:
package com.core.module.demo2;public class CatFactory implements Factory {@Overridepublic Animal createAnimal() {return new Cat();}}测试类:
package com.core.module.demo2;public class Test {public static void main(String[] args) {CatFactory catFactory = new CatFactory();Animal cat = catFactory.createAnimal();cat.eat();DogFactory dogFactory = new DogFactory();Animal dog = dogFactory.createAnimal();dog.eat();}}
E.单例设计模式
1.饿汉式
package com.core.module.demo3;//饿汉式public class Student {// 私有化构造函数private Student() {}//创建一个Student对象private static Student s = new Student();//对外提供一个获取对象方法public static Student getStudent(){return s;}}测试类:
package com.core.module.demo3;public class Test {public static void main(String[] args) {Student s1 = Student.getStudent();Student s2= Student.getStudent();System.out.println(s1==s2);//true}}
2.懒汉式
package com.core.module.demo4;//懒汉式public class Student {// 私有化构造函数private Student() {}// 创建一个Student对象private static Student s = null;// 对外提供一个获取对象方法public static Student getStudent() {if(s==null){s = new Student();}return s;}}
注意:懒汉式存在线程安全问题,
package com.core.module.demo4;//懒汉式public class Student {// 私有化构造函数private Student() {}// 创建一个Student对象private static Student s = null;// 对外提供一个获取对象方法//解决线程安全问题,同步方法public synchronized static Student getStudent() {if(s==null){s = new Student();}return s;}}
F.单例模式的Java代码体现Runtime类
package com.core.module.demo5;import java.io.IOException;/* * Runtime:每个Java应用程序都有一个Runtime类实例,使应用程序能够与其运行的环境相连接。 * exec(String command) */public class RunTimeDemo {public static void main(String[] args) throws IOException {Runtime r = Runtime.getRuntime();r.exec("calc");r.exec("notepad");}}/*public class Runtime { private static Runtime currentRuntime = new Runtime(); public static Runtime getRuntime() { return currentRuntime; } private Runtime() {}}*/
2.懒汉式
- JavaSe——设计模式
- 黑马程序员 JAVASE——单例设计模式
- JavaSE-设计模式-观察者模式
- JavaSE进阶-Java设计模式
- [javase]代理设计模式初步
- JavaSE实战——面向对象(上) 封装,继承,对象初始化流程,单例设计模式
- JavaSE学习笔记--单例设计模式
- javaSE-面向对象-单例设计模式
- javaSE(21)(适配器设计模式)
- javaSE(27)(观察者设计模式)
- JavaSE学习--单例设计模式
- JavaSE---多线程、面向对象设计思想、设计模式
- JavaSE-设计模式-三种工厂模式-比较区分
- JavaSE 23种 设计模式 之 单例模式
- JavaSE 拾遗(0)——JavaSE 主线
- JavaSE 拾遗(6)——JavaSE 异常
- JavaSE 拾遗(7)——JavaSE 多线程
- javaSE-单例设计模式的线程安全
- 预处理指令--C语言
- Cstdiofile类详解
- android mms Apn的omacp xml文件样本
- OTA本质与实现流程分析
- 常用数据类型的表示范围
- JavaSe——设计模式
- Maven deploy时报Fatal error compiling: tools.jar not found错误的问题处理
- mac系统中文版 download为英文
- NGUI-UIGrid
- Android创建快捷方式图标
- 使用beautifulsoup写的第一个小爬虫程序
- ControlButton
- 社説 20150303 朴大統領演説 硬直した対日姿勢が続くのか
- 图论--坑纪实