一个抽象基类,几个继承基类的具体实现类,一个抽象装饰类继承基类,几个装饰类实现抽象装饰类。
抽象基类如下:
package com.freshbin.pattern.decorate.myexample.component;
/**
* 抽象基类
* @author freshbin
* @date 2019-1-3 17:30:35
*/
public abstract class GameComponent {
public abstract void playGame();
}
具体实现类:
package com.freshbin.pattern.decorate.myexample.component;
/**
* 英雄联盟游戏
* @author freshbin
* @date 2019-1-3 17:47:45
*/
public class LOLComponent extends GameComponent {
@Override
public void playGame() {
System.out.print("玩英雄联盟游戏");
}
}
package com.freshbin.pattern.decorate.myexample.component;
/**
* 泥巴游戏
* @author freshbin
* @date 2019-1-3 17:44:21
*/
public class NibaComponent extends GameComponent {
@Override
public void playGame() {
System.out.print("玩泥巴游戏");
}
}
package com.freshbin.pattern.decorate.myexample.component;
/**
* 王者荣耀游戏
* @author freshbin
* @date 2019-1-3 17:33:40
*/
public class WangzheComponent extends GameComponent {
@Override
public void playGame() {
System.out.print("玩王者荣耀游戏");
}
}
装饰类:
package com.freshbin.pattern.decorate.myexample.decorator;
import com.freshbin.pattern.decorate.myexample.component.GameComponent;
/**
* 装饰者类
* @author freshbin
* @date 2019-1-3 17:35:09
*/
public abstract class Decorator extends GameComponent {
protected GameComponent gameComponent;
public void setGameComponent(GameComponent gameComponent) {
this.gameComponent = gameComponent;
}
@Override
public void playGame() {
if(gameComponent != null) {
gameComponent.playGame();
}
}
}
装饰实现类:
package com.freshbin.pattern.decorate.myexample.decorator;
/**
* 手柄装饰类
* @author freshbin
* @date 2019-1-3 17:45:18
*/
public class HandleDecorator extends Decorator {
@Override
public void playGame() {
System.out.print("手柄");
super.playGame();
}
}
package com.freshbin.pattern.decorate.myexample.decorator;
/**
* 键盘装饰类
* @author freshbin
* @date 2019-1-3 17:49:12
*/
public class KeyBoardDecorator extends Decorator {
@Override
public void playGame() {
System.out.print("键盘");
super.playGame();
}
}
package com.freshbin.pattern.decorate.myexample.decorator;
/**
* 鼠标装饰类
* @author freshbin
* @date 2019-1-3 17:48:15
*/
public class MouseDecorator extends Decorator {
@Override
public void playGame() {
System.out.print("鼠标");
super.playGame();
}
}
package com.freshbin.pattern.decorate.myexample.decorator;
/**
* 棍子装饰类
* @author freshbin
* @date 2019-1-3 17:37:43
*/
public class StickDecorator extends Decorator {
@Override
public void playGame() {
System.out.print("棍子");
super.playGame();
}
}
主类:
package com.freshbin.pattern.decorate.myexample;
import com.freshbin.pattern.decorate.myexample.component.GameComponent;
import com.freshbin.pattern.decorate.myexample.component.LOLComponent;
import com.freshbin.pattern.decorate.myexample.component.NibaComponent;
import com.freshbin.pattern.decorate.myexample.component.WangzheComponent;
import com.freshbin.pattern.decorate.myexample.decorator.Decorator;
import com.freshbin.pattern.decorate.myexample.decorator.HandleDecorator;
import com.freshbin.pattern.decorate.myexample.decorator.KeyBoardDecorator;
import com.freshbin.pattern.decorate.myexample.decorator.MouseDecorator;
import com.freshbin.pattern.decorate.myexample.decorator.StickDecorator;
/**
* 装饰者模式
* @author freshbin
* @date 2019-1-3 17:18:45
*/
public class DecorateMain {
public static void main(String[] args) {
System.out.print("freshbin用");
GameComponent gameComponent = new LOLComponent();
Decorator mouse = new MouseDecorator();
Decorator keyBoard = new KeyBoardDecorator();
mouse.setGameComponent(gameComponent);
keyBoard.setGameComponent(mouse);
keyBoard.playGame();
System.out.println();
System.out.println("=====================");
System.out.print("小明用");
Decorator stick = new StickDecorator();
gameComponent = new NibaComponent();
stick.setGameComponent(gameComponent);
stick.playGame();
System.out.println();
System.out.println("=======================");
System.out.print("后来,小明发现了新大陆,开始用");
gameComponent = new WangzheComponent();
Decorator handler = new HandleDecorator();
handler.setGameComponent(gameComponent);
handler.playGame();
System.out.println();
System.out.println("=======================");
System.out.print("freshbin看着觉得很好玩,也跟着用");
handler.playGame();
}
}
效果图: