我正在尝试对设计模式领域的同事进行教育。最初的“四人一组”模式有些神秘,所以我想知道是否有所有程序员都应该知道的“基本”模式子集。当我浏览列表时,我想我可能已经使用过-
- 抽象工厂
- 工厂方法
- 辛格尔顿
- 桥
- 正面
- 命令
您实际上在实践中使用了哪些?您将它们用于什么?
for, if, while...
等” 列表-很难衡量那将是多么毫无意义。
我正在尝试对设计模式领域的同事进行教育。最初的“四人一组”模式有些神秘,所以我想知道是否有所有程序员都应该知道的“基本”模式子集。当我浏览列表时,我想我可能已经使用过-
您实际上在实践中使用了哪些?您将它们用于什么?
for, if, while...
等” 列表-很难衡量那将是多么毫无意义。
Answers:
作者从在实际应用中发现的观察设计中编译了模式。没有人可能会全部使用它们,但是它们都被使用了。
装饰器。
编辑:在几乎超出“琐碎”阶段的每个项目中,最终都有一个IAction接口(细节可能有所不同):
// Programming Language does not matter
interface IAction {
bool operateOn(Foo* target);
string getDisplayName(); // useful for debugging and logging
};
下一个小时,我花了很多时间编写了一些很小的,几乎没有意义的类来实现IAction。结合使用时,它们将非常强大且灵活。
例如,LogAction
(写入日志并执行IAction),NullAction
(不执行任何操作并返回true),ActionList
(执行IActions列表并返回布尔值的ANDing)。在某些情况下,AndAction
(返回的两个动作该与荷兰国际集团,可能是短路与否)OrAction
,NotAction
是有意义的为好。
尽管从上面的示例的角度来看,从技术上讲,只有LogAction是一个Decorator(另一个不能完全在1个IAction上运行),但是当我制作IActions的LogActions的ActionList时,我仍然认为这是Decorator模式的概括。
我假设您的意思是将问题限制在自己的代码/项目(没有类库和第3方框架)中使用模式。
和其他人一样,我也经常使用Factory模式。然后
我使用了已经提到的许多其他功能(Singleton,Factory,Builder,Command,Strategy等)。
我还没有提到的一个是Flyweight,我经常使用它。我在下面提供了一个示例实现:
/**
* Flyweight class representing OCR digits.
*
* @author matt
*
*/
public class Digit {
/** Static flyweight map containing Digits which have been encountered. **/
private static Map digits = new HashMap();
/** The block of text representing Digit. **/
private String blockRep = null;
/** A map representing acceptable blocks of characters and the string representation of their
* numerical equivalents.
*/
public static final Map VALID_DIGITS;
/** Enum of valid digits. **/
public static enum DigitRep {
ZERO ( " _ \n" +
"| |\n" +
"|_|" ),
ONE ( " \n" +
" |\n" +
" |" ),
TWO ( " _ \n" +
" _|\n" +
"|_ " ),
THREE ( " _ \n" +
" _|\n" +
" _|" ),
FOUR ( " \n" +
"|_|\n" +
" |" ),
FIVE ( " _ \n" +
"|_ \n" +
" _|" ),
SIX ( " _ \n" +
"|_ \n" +
"|_|" ),
SEVEN ( " _ \n" +
" |\n" +
" |" ),
EIGHT ( " _ \n" +
"|_|\n" +
"|_|" ),
NINE ( " _ \n" +
"|_|\n" +
" _|" );
private String blockRep;
DigitRep(String blockRep) {
this.blockRep = blockRep;
}
@Override
public String toString() {
return blockRep;
}
}
static {
/* Initialize the map of acceptable character blocks. */
Map tmpMap = new HashMap();
tmpMap.put( DigitRep.ZERO.toString(), "0");
tmpMap.put( DigitRep.ONE.toString(), "1");
tmpMap.put( DigitRep.TWO.toString(), "2");
tmpMap.put( DigitRep.THREE.toString(), "3");
tmpMap.put( DigitRep.FOUR.toString(), "4");
tmpMap.put( DigitRep.FIVE.toString(), "5");
tmpMap.put( DigitRep.SIX.toString(), "6");
tmpMap.put( DigitRep.SEVEN.toString(), "7");
tmpMap.put( DigitRep.EIGHT.toString(), "8");
tmpMap.put( DigitRep.NINE.toString(), "9");
VALID_DIGITS = Collections.unmodifiableMap(tmpMap);
}
/**
* Private constructor to enforce flyweight/factory pattern.
*
* @param blockRep
*/
private Digit(String blockRep) {
this.blockRep = blockRep;
}
/**
* Flyweight factory method to create a Digit object from the "block"
* representation of the digit.
* @param blockRep The "block" representation of a digit. Should look
* something like:
* " _ \n"
* "|_|\n"
* "|_|"
* @return A flyweight Digit object representing the digit.
*/
public static synchronized Digit getDigit(String blockRep) {
Digit digit = digits.get(blockRep);
if(digit == null) {
digit = new Digit(blockRep);
digits.put(blockRep, digit);
}
return digit;
}
/**
* Determines whether or not the digit is valid.
* @return true if the digit is valid, else false.
*/
public boolean isValid() {
return VALID_DIGITS.containsKey(blockRep);
}
/**
* Accessor method to get the block representation of this digit.
*
* @return
*/
public String getBlockRep() {
return blockRep;
}
@Override
public String toString() {
return VALID_DIGITS.containsKey(blockRep) ? VALID_DIGITS.get(blockRep) : "?";
}
}
如今,大多数原始的“四人一组”模式仍在使用,但本书中没有其他流行的模式。
查找使用您所用语言的设计模式参考。它们往往更具体,并使用特定的语言功能以更简洁和优雅的方式实现模式。
设计模式的三大资源:
《 Head First设计模式》一书 -选择的语言是Java,但与所有语言都有关。 dofactory设计模式 -带有代码的出色,免费的.net设计模式说明。 PluralSight-设计模式库 -该库是有偿的,但是很好,不要将其包括在列表中。
我喜欢装饰器。我唯一提到的就是代理。