简介:
本文是个系列一次会出两个设计者模式作用,如果有关联就三个,除此外还会讲解在spring中作用。
23设计者模式以及重点模式
我们都知道设计者模式有3类23种设计模式,标红是特别重要的设计者模式建议都会,而且熟读于心,标蓝是指其次重要建议也要明白。
(1)创建型模式:单例模式、抽象工厂模式、构建者模式、工厂模式、原型模式。
(2)结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
(3)行为型模式:访问者模式、模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式。
装饰器模式(Decorator Pattern)
装饰器模式是一种结构型设计模式,允许动态地向一个对象添加额外的职责。在不改变对象自身的基础上,通过创建一个包装对象来“装饰”原始对象。这种模式创建了一个装饰类,用来包裹原始类,并在保持原类方法签名完整性的同时提供了额外的功能。
装饰器模式 专注于动态地添加职责到对象上,是一种灵活的替代继承的方法。
使用场景
- 当不想或不能通过继承增加对象的职责时,例如,当系统中的职责在运行时可能动态变化,或职责可选时。
- 当需要为一个对象添加一些额外的功能,并且这些功能可以动态地被添加或删除。
示例
// 抽象组件
interface Coffee {
String getDescription();
double cost();
}
// 具体组件
class SimpleCoffee implements Coffee {
public String getDescription() {
return "Simple Coffee";
}
public double cost() {
return 2.0;
}
}
// 装饰器基类
abstract class CoffeeDecorator implements Coffee {
protected Coffee decoratedCoffee;
public CoffeeDecorator(Coffee decoratedCoffee) {
this.decoratedCoffee = decoratedCoffee;
}
public String getDescription() {
return decoratedCoffee.getDescription();
}
public double cost() {
return decoratedCoffee.cost();
}
}
// 具体装饰器
class MilkDecorator extends CoffeeDecorator {
public MilkDecorator(Coffee decoratedCoffee) {
super(decoratedCoffee);
}
public String getDescription() {
return decoratedCoffee.getDescription() + ", Milk";
}
public double cost() {
return decoratedCoffee.cost() + 0.5;
}
}
// 测试类
public class DecoratorPatternDemo {
public static void main(String[] args) {
Coffee coffee = new SimpleCoffee();
coffee = new MilkDecorator(coffee);
System.out.println(coffee.getDescription() + " Cost: $" + coffee.cost());
}
}
在这个示例中,Coffee
是一个抽象组件,SimpleCoffee
是具体的组件,CoffeeDecorator
是一个装饰器基类,而 MilkDecorator
是具体的装饰器。可以看到,装饰器模式使得可以在运行时为对象 coffee
添加新的职责。
模板方法模式(Template Method Pattern)
模板方法模式是一种行为型设计模式,它在父类中定义了一个操作的算法的骨架,而将一些步骤的实现延迟到子类中。这样,可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
模板方法模式 在父类中定义了算法的框架,允许子类在不改变算法结构的情况下重写算法的特定步骤。
使用场景
- 当有多个类包含相同的算法,但算法的某些步骤在这些类之间有所不同时。
- 当需要控制子类扩展时。模板方法只在特定点调用“钩子”方法,这允许在这些点进行扩展。
示例
// 抽象类
abstract class Game {
abstract void initialize();
abstract void startPlay();
abstract void endPlay();
// 模板方法
public final void play() {
initialize();
startPlay();
endPlay();
}
}
// 具体类
class Cricket extends Game {
void initialize() {
System.out.println("Cricket Game Initialized!");
}
void startPlay() {
System.out.println("Cricket Game Started!");
}
void endPlay() {
System.out.println("Cricket Game Finished!");
}
}
// 测试类
public class TemplateMethodPatternDemo {
public static void main(String[] args) {
Game game = new Cricket();
game.play();
}
}
在这个示例中,Game
是一个包含模板方法 play
的抽象类,而 Cricket
是具体实现这些抽象方法的子类。模板方法 play
定义了游戏的结构,但具体的步骤在子类中有不同的实现。
------------------------------------------与正文内容无关------------------------------------
如果觉的文章写对各位读者老爷们有帮助的话,麻烦点赞加关注呗!作者在这拜谢了!
混口饭吃了!如果你需要Java 、Python毕设、网页和系统设计,还有你是刚入职的新手需要度过试用期。请在关注私信我,本人看到一定马上回复!