第三周总结
本周主要学习设计模式,并讲了几种模式在 junit 和 Spring 和老师实现的 HQL 中的使用。
什么是设计模式
每一种模式都描述了一种问题的通用解决方案。
设计模式是一种可重复使用的解决方案。
单例模式
单例中的成员变量是多线程重用的,可能会产生意想不到的结果,因此尽量将单例设计为无状态对象(只提供服务,不保存状态)。
模板方法模式
模板方法模式是扩展功能的最基本模式之一
它是一种 “类的行为模式”
它是通过“继承”的方法来实现扩展
基类负责算法的轮廓和骨架
子类负责算法的具体实现
策略模式
策略模式是扩展功能的另一种最基本的模式
它是一种 “对象的行为模式”
它是通过“组合”的方法来实现扩展
什么时候使用策略模式
系统需要在多种算法中选择一种
重构系统时, 将条件语句转换成对于策略的多态性调用
策略模式的优点
将使用策略的人与策略的具体实现分离
策略对象可以自由组合
策略模式可能存在的问题
策略模式仅仅封装了“算法的具体实现”,方便添加和替换算法。但它并不关心何时使用何种算法,这个必须由客户端来决定。
组合模式
是一种 “对象的结构模式”
装饰模式
是一种 “对象的结构模式“
装饰器的作用
在不改变客户端的接口的前提下
扩展现有对象的功能
适配器模式
比较适配器和装饰者
试着写了一下单例模式
public class Singleton1 {
private Singleton1(){
}
private static Singleton1 instance = new Singleton1();
public static Singleton1 getInstance(){
return instance ;
}
}
public class Singleton2 {
private Singleton2(){
}
private static Singleton2 instance = null ;
public static synchronized Singleton2 getInstance(){
if (instance == null){
instance = new Singleton2() ;
}
return instance ;
}
}
试着写了一下课堂上的装饰模式
public interface AnyThing {
void exe();
}
public class Dream implements AnyThing {
private AnyThing a ;
public Dream(AnyThing a){
this.a = a ;
}
public void exe(){
System.out.print("梦装饰了");
a.exe() ;
}
}
public class Moon implements AnyThing{
private AnyThing a ;
public Moon(AnyThing a){
this.a = a ;
}
public void exe(){
System.out.print("明月装饰了");
a.exe() ;
}
}
public class You implements AnyThing{
private AnyThing a ;
public You(AnyThing a){
this.a = a ;
}
public void exe(){
System.out.println("你");
}
}
public class Test {
public static void main(String[] args){
AnyThing t = new Moon(new Dream(new You(null)));
t.exe() ;
t = new Dream(new Moon(new You(null)));
t.exe() ;
}
}
用活设计模式,关键在于关于发现问题,先发现问题再考虑用设计模式去解决问题!
评论