一、 假设我们现在有一个开关(打开和关闭)、还有一个灯泡(发光和不发光),开关控制灯泡,当开关打开后,灯泡亮。思考:你如何做设计?
- 无脑操作来一次(还好不是if-else):
public class SAPtest {
public static void main(String[] args) {
new Switch(new App()).togglc();
}
public static class Light { //灯泡
public void open(){
System.out.println("我是灯泡,我发光了!");
}
public void off(){
System.out.println("我是灯泡,我关灯了!");
}
}
public static class Switch { //开关
private App app;
public Switch(App app) {
this.app = app;
}
public void togglc(){ //打开后再关闭
app.open();
app.off();
}
}
}
这可能就是最原始的面向对象,但是这样是否尽可能的满足扩展和复用性?可想而知,并不能!假设我们现在要加一个热水壶,我们怎么设计能够同时兼容这种开关?(从面向对象特性、抽象方式去思考)。
/**
* 电器接口
* 接口职责:电器工作、电器停止
*/
public interface ApplianceInterface {
public void open();
public void off();
}
public class SAPtest {
public static void main(String[] args) {
ApplianceInterface light = new Light();
new Switch(light).togglc();
ApplianceInterface kettle = new Kettle();
new Switch(kettle).togglc();
}
public static class Light implements ApplianceInterface { //灯泡
@Override
public void open() {
System.out.println("我是灯泡,我发光了!");
}
@Override
public void off() {
System.out.println("我是灯泡,我关灯了!");
}
}
public static class Kettle implements ApplianceInterface { //热水壶
@Override
public void open() {
System.out.println("我是热水壶,我开始热水了!");
}
@Override
public void off() {
System.out.println("我是热水壶,我停止热水了!");
}
}
public static class Switch { //开关
private ApplianceInterface app;
public Switch(ApplianceInterface app) {
this.app = app;
}
public void togglc() { //打开后再关闭
app.open();
// 。。。
app.off();
}
}
}
这下比较好些了,我们提供了一个ApplianceInterface的接口,只要实现这个接口的,我的开关都兼容,这也是多态的一个简单示例;
再来点有难度的,我们来个100个假设:
1.假设我想让我的热水器在(现有的基础上,不改变原有类)加个闪光灯(是不是很潇洒);
2.假如我的开关也想让他也有多个按钮,加个开启闪光灯的按钮吧;
come on, zouni!
public class SAPtest {
public static void main(String[] args) {
ApplianceInterface2 kettle2 = new Kettle2();
Switch aSwitch = new Switch(kettle2);
aSwitch.togglc();
aSwitch.colorStart();
}
public static class Kettle implements ApplianceInterface { // 热水壶
@Override
public void open() {
System.out.println("我是热水壶,我开始热水了!");
}
@Override
public void off() {
System.out.println("我是热水壶,我停止热水了!");
}
}
public interface ApplianceInterface2 extends ApplianceInterface { // 新加的炫彩灯接口
public void openColor();
}
public static class Kettle2 extends Kettle implements ApplianceInterface2 { // 新的炫彩热水壶
@Override
public void open() {
super.open();
}
@Override
public void off() {
super.off();
}
@Override
public void openColor() {
System.out.println("我是炫彩热水壶,我有彩灯!");
}
}
public static class Switch implements SwitchInterface { // 开关是新的
private ApplianceInterface2 app;
public Switch(ApplianceInterface2 app) {
this.app = app;
}
public void togglc() { //打开后再关闭
start();
// 。。。
stop();
}
@Override
public void start() {
this.app.open();
}
@Override
public void stop() {
this.app.off();
}
@Override
public void colorStart() {
this.app.openColor();
}
}
}
实话说,用了什么设计模式,我也不知道,我也希望实战的人不要去关心叫什么,而是去运用面向对象的思维方式。具体应用了哪种模式我后续做个研究总结。
网友评论