`
chjavach
  • 浏览: 464657 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

研磨设计模式之装饰模式-2

阅读更多

2  解决方案

2.1  装饰模式来解决

        用来解决上述问题的一个合理的解决方案,就是使用装饰模式。那么什么是装饰模式呢?
(1)装饰模式定义



 (2)应用装饰模式来解决的思路
        虽然经过简化,业务简单了很多,但是需要解决的问题不会少,还是要解决:要透明的给一个对象增加功能,并实现功能的动态组合。
        所谓透明的给一个对象增加功能,换句话说就是要给一个对象增加功能,但是不能让这个对象知道,也就是不能去改动这个对象。而实现了能够给一个对象透明的增加功能,自然就能够实现功能的动态组合,比如原来的对象有A功能,现在透明的给它增加了一个B功能,是不是就相当于动态组合了A和B功能呢。
        要想实现透明的给一个对象增加功能,也就是要扩展对象的功能了,使用继承啊,有人马上提出了一个方案,但很快就被否决了,那要减少或者修改功能呢?事实上继承是非常不灵活的复用方式。那就用“对象组合”嘛,又有人提出新的方案来了,这个方案得到了大家的赞同。
        在装饰模式的实现中,为了能够和原来使用被装饰对象的代码实现无缝结合,是通过定义一个抽象类,让这个类实现与被装饰对象相同的接口,然后在具体实现类里面,转调被装饰的对象,在转调的前后添加新的功能,这就实现了给被装饰对象增加功能,这个思路跟“对象组合”非常类似。如果对“对象组合”不熟悉,请参见3.1的第2小节。
在转调的时候,如果觉得被装饰的对象的功能不再需要了,还可以直接替换掉,也就是不再转调,而是在装饰对象里面完全全新的实现。


2.2  模式结构和说明

 装饰模式的结构如图1所示:

 

 

                                                图1  装饰模式结构图
Component:
        组件对象的接口,可以给这些对象动态的添加职责。
ConcreteComponent:
        具体的组件对象,实现组件对象接口,通常就是被装饰器装饰的原始对象,也就是可以给这个对象添加职责。
Decorator:
        所有装饰器的抽象父类,需要定义一个与组件接口一致的接口,并持有一个Component对象,其实就是持有一个被装饰的对象。
        注意这个被装饰的对象不一定是最原始的那个对象了,也可能是被其它装饰器装饰过后的对象,反正都是实现的同一个接口,也就是同一类型。
ConcreteDecorator:
        实际的装饰器对象,实现具体要向被装饰对象添加的功能。

2.3  装饰模式示例代码

(1)先来看看组件对象的接口定义,示例代码如下:

/**
 * 组件对象的接口,可以给这些对象动态的添加职责
 */
public abstract class Component {
	/**
	 * 示例方法
	 */
	public abstract void operation();
}

 (2)定义了接口,那就看看具体组件实现对象示意吧,示例代码如下:

/**
 * 具体实现组件对象接口的对象
 */
public class ConcreteComponent extends Component {
	public void operation() {
		//相应的功能处理
	}
}

 (3)接下来看看抽象的装饰器对象,示例代码如下:

/**
 * 装饰器接口,维持一个指向组件对象的接口对象,并定义一个与组件接口一致的接口
 */
public abstract  class Decorator extends Component {
	/**
	 * 持有组件对象
	 */
	protected Component component;
	/**
	 * 构造方法,传入组件对象
	 * @param component 组件对象
	 */
	public Decorator(Component component) {
		this.component = component;
	}
	public void operation() {
		//转发请求给组件对象,可以在转发前后执行一些附加动作
		component.operation();
	}
}

 (4)该来看看具体的装饰器实现对象了,这里有两个示意对象,一个示意了添加状态,一个示意了添加职责。先看添加了状态的示意对象吧,示例代码如下:

/**
 * 装饰器的具体实现对象,向组件对象添加职责
 */
public class ConcreteDecoratorA extends Decorator {
	public ConcreteDecoratorA(Component component) {
		super(component);
	}
	/**
	 * 添加的状态
	 */
	private String addedState;	
	public String getAddedState() {
		return addedState;
	}
	public void setAddedState(String addedState) {
		this.addedState = addedState;
	}
	public void operation() {
		//调用父类的方法,可以在调用前后执行一些附加动作
		//在这里进行处理的时候,可以使用添加的状态
		super.operation();
	}
}

 接下来看看添加职责的示意对象,示例代码如下:

/**
 * 装饰器的具体实现对象,向组件对象添加职责
 */
public class ConcreteDecoratorB extends Decorator {
	public ConcreteDecoratorB(Component component) {
		super(component);
	}
	/**
	 * 需要添加的职责
	 */
	private void addedBehavior() {
		//需要添加的职责实现
	}
	public void operation() {
		//调用父类的方法,可以在调用前后执行一些附加动作
		super.operation();
		addedBehavior();
	}
}

 

 

 

2.4  使用装饰模式重写示例

        看完了装饰模式的基本知识,该来考虑如何使用装饰模式重写前面的示例了。要使用装饰模式来重写前面的示例,大致会有如下改变:

  • 首先需要定义一个组件对象的接口,在这个接口里面定义计算奖金的业务方法,因为外部就是使用这个接口来操作装饰模式构成的对象结构中的对象
  • 需要添加一个基本的实现组件接口的对象,可以让它返回奖金为0就可以了
  • 把各个计算奖金的规则当作装饰器对象,需要为它们定义一个统一的抽象的装饰器对象,好约束各个具体的装饰器的接口
  • 把各个计算奖金的规则实现成为具体的装饰器对象

先看看现在示例的整体结构,好整体理解和把握示例,如图2所示:

 

 

                           图2  使用装饰模式重写示例的程序结构示意图
(1)计算奖金的组件接口和基本的实现对象
        在计算奖金的组件接口中,需要定义原本的业务方法,也就是实现奖金计算的方法,示例代码如下:

/**
 * 计算奖金的组件接口
 */
public abstract class Component {
	/**
	 * 计算某人在某段时间内的奖金,有些参数在演示中并不会使用,
	 * 但是在实际业务实现上是会用的,为了表示这是个具体的业务方法,
	 * 因此这些参数被保留了
	 * @param user 被计算奖金的人员
	 * @param begin 计算奖金的开始时间
	 * @param end 计算奖金的结束时间
	 * @return 某人在某段时间内的奖金
	 */
	public abstract double calcPrize(String user
,Date begin,Date end);
}

  为这个业务接口提供一个基本的实现,示例代码如下:

/**
 * 基本的实现计算奖金的类,也是被装饰器装饰的对象
 */
public class ConcreteComponent extends Component{
	public double calcPrize(String user, Date begin, Date end) {
		//只是一个默认的实现,默认没有奖金
		return 0;
	}
}

 (2)定义抽象的装饰器
在进一步定义装饰器之前,先定义出各个装饰器公共的父类,在这里定义所有装饰器对象需要实现的方法。这个父类应该实现组件的接口,这样才能保证装饰后的对象仍然可以继续被装饰。示例代码如下:

/**
 * 装饰器的接口,需要跟被装饰的对象实现同样的接口
 */
public abstract class Decorator extends Component{
	/**
	 * 持有被装饰的组件对象
	 */
	protected Component c;
	/**
	 * 通过构造方法传入被装饰的对象
	 * @param c被装饰的对象
	 */
	public Decorator(Component c){
		this.c = c;
	}
	public double calcPrize(String user, Date begin, Date end) {
		//转调组件对象的方法
		return c.calcPrize(user, begin, end);
	}
}

(3)定义一系列的装饰器对象
       用一个具体的装饰器对象,来实现一条计算奖金的规则,现在有三条计算奖金的规则,那就对应有三个装饰器对象来实现,依次来看看它们的实现。
        这些装饰器涉及到的TempDB跟以前一样,这里就不去赘述了。
        首先来看实现计算当月业务奖金的装饰器,示例代码如下:

/**
 * 装饰器对象,计算当月业务奖金
 */
public class MonthPrizeDecorator extends Decorator{
	public MonthPrizeDecorator(Component c){
		super(c);
	}	
	public double calcPrize(String user, Date begin, Date end) {
		//1:先获取前面运算出来的奖金
		double money = super.calcPrize(user, begin, end);
		//2:然后计算当月业务奖金,按人员和时间去获取当月业务额,然后再乘以3%
		double prize = TempDB.mapMonthSaleMoney.get(user) * 0.03;
		System.out.println(user+"当月业务奖金"+prize);
		return money + prize;
	}
}

 接下来看实现计算累计奖金的装饰器,示例代码如下:

/**
 * 装饰器对象,计算累计奖金
 */
public class SumPrizeDecorator extends Decorator{
	public SumPrizeDecorator(Component c){
		super(c);
	}	
	public double calcPrize(String user, Date begin, Date end) {
		//1:先获取前面运算出来的奖金
		double money = super.calcPrize(user, begin, end);
		//2:然后计算累计奖金,其实应按人员去获取累计的业务额,然后再乘以0.1%
		//简单演示一下,假定大家的累计业务额都是1000000元
		double prize = 1000000 * 0.001;
		System.out.println(user+"累计奖金"+prize);
		return money + prize;
	}
}

 接下来看实现计算当月团队业务奖金的装饰器,示例代码如下:

/**
 * 装饰器对象,计算当月团队业务奖金
 */
public class GroupPrizeDecorator extends Decorator{
	public GroupPrizeDecorator(Component c){
		super(c);
	}
	public double calcPrize(String user, Date begin, Date end) {
		//1:先获取前面运算出来的奖金
		double money = super.calcPrize(user, begin, end);
		//2:然后计算当月团队业务奖金,先计算出团队总的业务额,然后再乘以1%
		//假设都是一个团队的
		double group = 0.0;
		for(double d : TempDB.mapMonthSaleMoney.values()){
			group += d;
		}
		double prize = group * 0.01;
		System.out.println(user+"当月团队业务奖金"+prize);
		return money + prize;
	}
}

 (4)使用装饰器的客户端
         使用装饰器的客户端,首先需要创建被装饰的对象,然后创建需要的装饰对象,接下来重要的工作就是组合装饰对象,依次对前面的对象进行装饰。
         有很多类似的例子,比如生活中的装修,就拿装饰墙壁来说吧:没有装饰前是原始的砖墙,这就好比是被装饰的对象,首先需要刷腻子,把墙找平,这就好比对原始的砖墙进行了一次装饰,而刷的腻子就好比是一个装饰器对象;好了,装饰一回了,接下来该刷墙面漆了,这又好比装饰了一回,刷的墙面漆就好比是又一个装饰器对象,而且这回被装饰的对象不是原始的砖墙了,而是被腻子装饰器装饰过后的墙面,也就是说后面的装饰器是在前面的装饰器装饰过后的基础之上,继续装饰的,类似于一层一层叠加的功能。
         同样的道理,计算奖金也是这样,先创建基本的奖金对象,然后组合需要计算的奖金类型,依次组合计算,最后的结果就是总的奖金。示例代码如下:

/**
 * 使用装饰模式的客户端
 */
public class Client {
	public static void main(String[] args) {
		//先创建计算基本奖金的类,这也是被装饰的对象
		Component c1 = new ConcreteComponent();
		
		//然后对计算的基本奖金进行装饰,这里要组合各个装饰
		//说明,各个装饰者之间最好是不要有先后顺序的限制,
//也就是先装饰谁和后装饰谁都应该是一样的
		
		//先组合普通业务人员的奖金计算
		Decorator d1 = new MonthPrizeDecorator(c1);
		Decorator d2 = new SumPrizeDecorator(d1);	
		
		//注意:这里只需使用最后组合好的对象调用业务方法即可,会依次调用回去
		//日期对象都没有用上,所以传null就可以了
		double zs = d2.calcPrize("张三",null,null);		
		System.out.println("==========张三应得奖金:"+zs);
		double ls = d2.calcPrize("李四",null,null);
		System.out.println("==========李四应得奖金:"+ls);
		
		//如果是业务经理,还需要一个计算团队的奖金计算
		Decorator d3 = new GroupPrizeDecorator(d2);
		double ww = d3.calcPrize("王五",null,null);
		System.out.println("==========王经理应得奖金:"+ww);
	}
}

 测试一下,看看结果,示例如下:

张三当月业务奖金300.0
张三累计奖金1000.0
==========张三应得奖金:1300.0
李四当月业务奖金600.0
李四累计奖金1000.0
==========李四应得奖金:1600.0
王五当月业务奖金900.0
王五累计奖金1000.0
王五当月团队业务奖金600.0
==========王经理应得奖金:2500.0

      

      当测试运行的时候会按照装饰器的组合顺序,依次调用相应的装饰器来执行业务功能,是一个递归的调用方法,以业务经理“王五”的奖金计算做例子,画个图来说明奖金的计算过程吧,看看是如何调用的,如图3所示:


                                图3  装饰模式示例的组合和调用过程示意图
        这个图很好的揭示了装饰模式的组合和调用过程,请仔细体会一下。

 

         如同上面的示例,对于基本的计算奖金的对象而言,由于计算奖金的逻辑太过于复杂,而且需要在不同的情况下进行不同的运算,为了灵活性,把多种计算奖金的方式分散到不同的装饰器对象里面,采用动态组合的方式,来给基本的计算奖金的对象增添计算奖金的功能,每个装饰器相当于计算奖金的一个部分。
       这种方式明显比为基本的计算奖金的对象增加子类来得更灵活,因为装饰模式的起源点是采用对象组合的方式,然后在组合的时候顺便增加些功能。为了达到一层一层组装的效果,装饰模式还要求装饰器要实现与被装饰对象相同的业务接口,这样才能以同一种方式依次组合下去。
       灵活性还体现在动态上,如果是继承的方式,那么所有的类实例都有这个功能了,而采用装饰模式,可以动态的为某几个对象实例添加功能,而不是对整个类添加功能。比如上面示例中,客户端测试的时候,对张三李四就只是组合了两个功能,对王五就组合了三个功能,但是原始的计算奖金的类都是一样的,只是动态的为它增加的功能不同而已。

 

 

未完待续,十一后见

  • 大小: 1.6 KB
  • 大小: 8.8 KB
  • 大小: 12.3 KB
  • 大小: 5.3 KB
78
3
分享到:
评论
17 楼 ruzhefeng 2011-01-06  
我把腻子、墙面漆、壁纸这些装饰器准备好,原始的墙面就是被装饰的组件对象,默认的实现就是腻子找平,我有N多的墙,要求不同,有的只需要腻子就可以了,有的需要腻子、墙面漆,有的是全都要。OK,怎么组合随便你,欧耶!这是为什么呢??? 
16 楼 liuyupy 2010-11-19  
JAVA IO 典型的装饰器模式。楼主讲的不错。
15 楼 lwp2000 2010-11-18  
A6_Acan 写道
A6_Acan 写道
liuhaoyi490 写道


有何问题呢?你可以看看父类中的calcPrize方法,其实就是转调被装饰对象的方法.
chjavach 写道
liuhaoyi490 写道
/**
* 装饰器对象,计算当月业务奖金
*/ 
public class MonthPrizeDecorator extends Decorator{ 
    public MonthPrizeDecorator(Component c){ 
        super(c); 
    }    
    public double calcPrize(String user, Date begin, Date end) { 
        //1:先获取前面运算出来的奖金 
        double money = super.calcPrize(user, begin, end); 
        //2:然后计算当月业务奖金,按人员和时间去获取当月业务额,然后再乘以3% 
        double prize = TempDB.mapMonthSaleMoney.get(user) * 0.03; 
        System.out.println(user+"当月业务奖金"+prize); 
        return money + prize; 
    } 

lz在代码中  double money = super.calcPrize(user, begin, end);  中super关键字使用是否值得斟酌一下是否正确?


有何问题呢?你可以看看父类中的calcPrize方法,其实就是转调被装饰对象的方法.

那你觉得
    public MonthPrizeDecorator(Component c){ 
        super(c); 
    }    
构造函数是干什么用的传入的"c"又是什么东西呢?能解释一下么?


没题,博主这里有个小小的错误,应该是c.calcPrize,而不是super.calcPrize。


对不起,其实没有错,没看清楚博主的回复。

是转调抽象父类装饰器的方法,不是转调被装饰的对象方法!
14 楼 A6_Acan 2010-11-11  
A6_Acan 写道
liuhaoyi490 写道


有何问题呢?你可以看看父类中的calcPrize方法,其实就是转调被装饰对象的方法.
chjavach 写道
liuhaoyi490 写道
/**
* 装饰器对象,计算当月业务奖金
*/ 
public class MonthPrizeDecorator extends Decorator{ 
    public MonthPrizeDecorator(Component c){ 
        super(c); 
    }    
    public double calcPrize(String user, Date begin, Date end) { 
        //1:先获取前面运算出来的奖金 
        double money = super.calcPrize(user, begin, end); 
        //2:然后计算当月业务奖金,按人员和时间去获取当月业务额,然后再乘以3% 
        double prize = TempDB.mapMonthSaleMoney.get(user) * 0.03; 
        System.out.println(user+"当月业务奖金"+prize); 
        return money + prize; 
    } 

lz在代码中  double money = super.calcPrize(user, begin, end);  中super关键字使用是否值得斟酌一下是否正确?


有何问题呢?你可以看看父类中的calcPrize方法,其实就是转调被装饰对象的方法.

那你觉得
    public MonthPrizeDecorator(Component c){ 
        super(c); 
    }    
构造函数是干什么用的传入的"c"又是什么东西呢?能解释一下么?


没题,博主这里有个小小的错误,应该是c.calcPrize,而不是super.calcPrize。


对不起,其实没有错,没看清楚博主的回复。
13 楼 A6_Acan 2010-11-11  
liuhaoyi490 写道


有何问题呢?你可以看看父类中的calcPrize方法,其实就是转调被装饰对象的方法.
chjavach 写道
liuhaoyi490 写道
/**
* 装饰器对象,计算当月业务奖金
*/ 
public class MonthPrizeDecorator extends Decorator{ 
    public MonthPrizeDecorator(Component c){ 
        super(c); 
    }    
    public double calcPrize(String user, Date begin, Date end) { 
        //1:先获取前面运算出来的奖金 
        double money = super.calcPrize(user, begin, end); 
        //2:然后计算当月业务奖金,按人员和时间去获取当月业务额,然后再乘以3% 
        double prize = TempDB.mapMonthSaleMoney.get(user) * 0.03; 
        System.out.println(user+"当月业务奖金"+prize); 
        return money + prize; 
    } 

lz在代码中  double money = super.calcPrize(user, begin, end);  中super关键字使用是否值得斟酌一下是否正确?


有何问题呢?你可以看看父类中的calcPrize方法,其实就是转调被装饰对象的方法.

那你觉得
    public MonthPrizeDecorator(Component c){ 
        super(c); 
    }    
构造函数是干什么用的传入的"c"又是什么东西呢?能解释一下么?


没题,博主这里有个小小的错误,应该是c.calcPrize,而不是super.calcPrize。
12 楼 liuhaoyi490 2010-10-18  


有何问题呢?你可以看看父类中的calcPrize方法,其实就是转调被装饰对象的方法.
chjavach 写道
liuhaoyi490 写道
/**
* 装饰器对象,计算当月业务奖金
*/ 
public class MonthPrizeDecorator extends Decorator{ 
    public MonthPrizeDecorator(Component c){ 
        super(c); 
    }    
    public double calcPrize(String user, Date begin, Date end) { 
        //1:先获取前面运算出来的奖金 
        double money = super.calcPrize(user, begin, end); 
        //2:然后计算当月业务奖金,按人员和时间去获取当月业务额,然后再乘以3% 
        double prize = TempDB.mapMonthSaleMoney.get(user) * 0.03; 
        System.out.println(user+"当月业务奖金"+prize); 
        return money + prize; 
    } 

lz在代码中  double money = super.calcPrize(user, begin, end);  中super关键字使用是否值得斟酌一下是否正确?


有何问题呢?你可以看看父类中的calcPrize方法,其实就是转调被装饰对象的方法.

那你觉得
    public MonthPrizeDecorator(Component c){ 
        super(c); 
    }    
构造函数是干什么用的传入的"c"又是什么东西呢?能解释一下么?
11 楼 chjavach 2010-10-15  
liuhaoyi490 写道
/**
* 装饰器对象,计算当月业务奖金
*/ 
public class MonthPrizeDecorator extends Decorator{ 
    public MonthPrizeDecorator(Component c){ 
        super(c); 
    }    
    public double calcPrize(String user, Date begin, Date end) { 
        //1:先获取前面运算出来的奖金 
        double money = super.calcPrize(user, begin, end); 
        //2:然后计算当月业务奖金,按人员和时间去获取当月业务额,然后再乘以3% 
        double prize = TempDB.mapMonthSaleMoney.get(user) * 0.03; 
        System.out.println(user+"当月业务奖金"+prize); 
        return money + prize; 
    } 

lz在代码中  double money = super.calcPrize(user, begin, end);  中super关键字使用是否值得斟酌一下是否正确?


有何问题呢?你可以看看父类中的calcPrize方法,其实就是转调被装饰对象的方法.
10 楼 liuhaoyi490 2010-10-15  
/**
* 装饰器对象,计算当月业务奖金
*/ 
public class MonthPrizeDecorator extends Decorator{ 
    public MonthPrizeDecorator(Component c){ 
        super(c); 
    }    
    public double calcPrize(String user, Date begin, Date end) { 
        //1:先获取前面运算出来的奖金 
        double money = super.calcPrize(user, begin, end); 
        //2:然后计算当月业务奖金,按人员和时间去获取当月业务额,然后再乘以3% 
        double prize = TempDB.mapMonthSaleMoney.get(user) * 0.03; 
        System.out.println(user+"当月业务奖金"+prize); 
        return money + prize; 
    } 

lz在代码中  double money = super.calcPrize(user, begin, end);  中super关键字使用是否值得斟酌一下是否正确?
9 楼 lucky16 2010-10-04  
大大又更新了, 呵呵,
加油,!
国庆完了抽时间来看看!
8 楼 changedi 2010-09-29  
继续关注,期待10.1的表现~~~
7 楼 西门吹牛 2010-09-28  

好像选择计算公式时的那一堆if else还是得有,这个也给去了就完美了
6 楼 452mian 2010-09-27  
写得真好,高人就是高人,保持一贯的高水准
5 楼 printout 2010-09-27  
  一直对装饰模式理解得不是很到位,看了博主的示例,尤其是那个图--装饰模式示例的组合和调用过程示意图,让我一下子开了窍,谢谢博主!
4 楼 puvg990 2010-09-27  
  
3 楼 zzc_zj 2010-09-27  
博主分享的知识对我非常有用,感谢分享
祝博主和各位javaeyer国庆快乐
2 楼 brandom520 2010-09-27  
恩,祝博主国庆快乐!
期待博主十一后的文章。
1 楼 duan129 2010-09-27  
也祝博主国庆节快乐!
你分享的知识非常非常地好,十分感谢!
也同祝其他朋友国庆节快乐!

相关推荐

    研磨设计模式源码

    《研磨设计模式源码》是一份非常宝贵的资源,它提供了设计模式的实践代码,帮助开发者深入理解并应用这些模式。设计模式是软件工程中经过长期实践总结出来的一套通用解决方案,它们描述了在特定场景下如何解决常见...

    研磨设计模式(完整带书签).part2.pdf

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式-配套源代码 UTF-8格式

    《研磨设计模式》是一本深入探讨软件设计原则与实践的经典书籍,其配套源代码提供了丰富的实例,帮助读者更好地理解和应用各种设计模式。这个UTF-8格式的压缩包包含了书中介绍的各种设计模式的实现,是学习和研究...

    研磨设计模式-配套源代码

    以上只是设计模式中的一部分,研磨设计模式的配套源代码可能涵盖了这些或更多的模式。通过学习这些源代码,你可以更深入地理解每个模式的实现细节,以及如何在实际项目中灵活应用。这将有助于提升你的编程技能,使...

    研磨设计模式PDF

    《研磨设计模式》这本书是陈臣和王斌两位作者合作的成果,专注于讲解软件设计中的模式应用。设计模式是软件工程中的一种最佳实践,它总结了在特定上下文中解决问题的常见方法,使得开发者可以复用这些解决方案,提高...

    研磨设计模式-配套源代码.7z

    《研磨设计模式》是一本深入探讨软件设计模式的书籍,其配套源代码包含了许多经典设计模式的实际应用示例。这些源代码可以帮助读者更直观地理解设计模式的原理和使用方法,进一步提升软件开发能力。 设计模式是软件...

    研磨设计模式[书签]

    《研磨设计模式》是由陈臣和王斌合著,由清华大学出版社出版的一本深入探讨设计模式的专业书籍。设计模式是软件工程中的一个重要概念,它代表了在特定上下文中解决问题的常见方法,经过时间和实践的验证,具有很高的...

    研磨设计模式-配套源代码.rar

    《研磨设计模式》是一本深入探讨软件设计模式的书籍,配套源代码是作者为了帮助读者更好地理解和应用书中介绍的设计模式而提供的实践示例。设计模式是软件开发中经过实践检验的、解决常见问题的模板,它为软件设计...

    研磨设计模式.rar

    《研磨设计模式》这本书是软件开发领域中的经典之作,主要关注的是面向对象设计中的设计模式。设计模式是在特定上下文中解决常见问题的最佳实践,它为开发者提供了在类似情况下重复使用解决方案的模板,有助于提高...

    研磨设计模式全部源代码

    这个压缩包“研磨设计模式全部源代码”包含了多种设计模式的实现,这些模式可以帮助开发者写出更可维护、可扩展和可复用的代码。下面将详细讲解其中可能包含的一些重要设计模式及其应用。 1. 工厂模式:这是最简单...

    研磨设计模式博文集

    这个“研磨设计模式博文集”显然是一份深入探讨设计模式的资料集合,其中可能包含了对多种设计模式的详细解析、示例代码以及实际应用中的经验分享。在软件开发中,设计模式能够帮助开发者提高代码质量、可读性和可...

    研磨设计模式讲课PPT

    研磨设计模式是一本深入探讨软件设计原则与实践的书籍,其讲课PPT为我们提供了丰富的设计模式知识。设计模式是软件工程中经过实践验证的、解决常见问题的模板,是经验丰富的开发人员智慧的结晶。这些模式可以帮助...

    研磨设计模式 源代码

    《研磨设计模式》是一本深入探讨软件设计模式的经典书籍,源代码包含了书中所讲解的各种设计模式的实际应用示例。设计模式是软件工程中的重要概念,它们是经过反复验证、在特定情境下解决常见问题的有效解决方案。...

    研磨设计模式-part2

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式(完整带书签).part1.pdf

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式 演示源代码

    "研磨设计模式 演示源代码"这个资源包含了对设计模式的详细解释和实例分析,旨在帮助学习者深入理解和应用这些模式。 1. **单例模式**:确保一个类只有一个实例,并提供一个全局访问点。在资源管理、缓存或者线程池...

    研磨设计模式-part4

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式-part3

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式视频课程PPT

    这个名为“研磨设计模式视频课程PPT”的压缩包包含了一份关于23种核心设计模式的详细教学资料,旨在帮助开发者提升软件设计的效率和可维护性。下面将对这些设计模式进行深入解析。 1. **单例模式(Singleton)**:...

    X-gen PPT下载——《研磨设计模式》 实战

    《研磨设计模式》实战是IT领域中关于软件设计的一份重要资料,它主要探讨了设计模式在实际项目中的应用。设计模式是软件工程中经过长期实践总结出的通用问题解决方案,是解决常见设计问题的经验总结。这份PPT可能是...

Global site tag (gtag.js) - Google Analytics