自定义布局之树形布局(九):策略模式+装饰模式+工厂方法模式

本文介绍如何使用策略模式和装饰模式增强树形布局的灵活性,并通过工厂方法模式简化复杂对象的创建过程。

上一篇讲述如何优化Padding使其在树形布局内部拖拽时也能生效。本篇讲解如何通过两种设计模式来极大地增加布局的拓展性。

前期准备

在真正开始之前我们首先要熟悉两种设计模式。

1.策略模式

策略模式可以将一些具有相似特征的算法提取出来变成一个接口,这样就可以根据需要动态地实现算法的替换。说得有些抽象,举个例子。

比如一个类要用到排序,根据排序量大小、初始状态的不同,我们可以在快排、冒泡、归并等等算法进行选择。但是常规的方式是通过if-else分支来实现。问题就来了,如果现在要添加一种排序算法,就不得不在代码里再添加一个else代码块,这是与开闭原则相悖的。代码如下:

class ClassA{
   
   
	void sort(int arr[]){
   
   
		if(...){
   
   
			//快排
		}else if(...){
   
   
			//冒泡
		}else if(...){
   
   
			//归并
		}else if(...){
   
   
			//新添加的排序算法
		}
	}
}

想想看,如果大多数情况代码都要跳到第四种算法来进行排序,那就避免不了大量的比较判断。利用策略模式就能为了解决上述两种问题。

无论是快排、冒泡还是归并,它们都有共同操作那就是给数组排序,所以可以抽象出一个排序类(或接口)。

public interface SortStrategy{
   
   
	void sort(int arr[]);
}

具体是怎么排的就看它们自己的实现方式了。

public class QuickSort extends SortStrategy{
   
   
	public void sort(int arr[]){
   
   
		...
		//算法用时方恨少,哎...忘的差不多了
	}
}

public class BubbleSort extends SortStrategy{
   
   
	public void sort(int arr[]){
   
   
		...
	}
}

public class MergerSort extends SortStrategy{
   
   
	public void sort(int arr[]){
   
   
		...
	}
}

根据需要使用具体的策略就行了,就算要添加新的排序算法,也不需要再修改ClassA了,而且还能避免大量的if-else分支判断。

class ClassA{
   
   
	void sort(int arr[],SortStrategy sortStrategy){
   
   
		sortStrategy.sort(arr);
	}
}
2.装饰模式

装饰模式是一种结构型设计模式,这种设计模式可以动态地拓展原有对象的功能,代替类的继承。下面举个例子。

//车辆类,抽象类
abstract class Vehicle{
   
   
	abstract void run();
}

//汽车类
class 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值