设计模式初学———"鸭子"模式
最近刚刚开了设计模式,我们学习的是Head First设计模式这本书,写的很形象很生动,一开始的“鸭子”设计模式就很让我感兴趣,自己不知不觉已经学程序学了快两年了,尴尬的是啥也没学会,不行,以后要强迫自己学点东西了,就从现在开始吧!
一开始感觉这个设计模式挺麻烦的,怎么要创建这么多类,继承不就完事了吗?不过学了之后才明白了自己的无知,,,虽然书上的鸭子模式挺好学的,但为了自己能形象地记住,我自己想了一个超级符合我的问题来记住这个模式。
lol有很多技能,比如q w e r等等,,下边就为这些技能创建个类AllSkills如下:
package com.jineng;
public abstract class AllSkills {
public void Qskill() {
System.out.println("Q技能");
}
public void Wskill() {
System.out.println("W技能");
}
public void Eskill() {
System.out.println("E技能");
}
public void Rskill() {
System.out.println("R技能");
}
}
然后问题来了,身为一个辅助(原谅我这个小菜)老子一般多一个技能——秘术,插眼!!这到底该怎么办?再往这个类里加一个主动技能?可这样一旦子类调用它们都能实现啊!这样辅助岂不是毫无作用?不行,再添加一个类来实现这个主动技能,可java不支持多继承啊,怎么办,难道我辅助游戏里不如人,代码里也不如人?我不服!!!——java仿佛听到了辅助的呐喊,于是派来了接口来拯救辅助,“接口”一出,众生皆臣服。下边就是方法:
创建一个ActiveSkill 接口,并且赋予它方法如下:
public interface ActiveSkill {
public void Activeskill() ;
}
然后在原先类里边加入如下
ActiveSkill active; 以及方法
public void activekill()
{
active.Activeskill();
}
就ok了,
接下来的任务就是如何拥有主动技能了,也很简单,创建一个ActiveSkills类implements这个接口来实现自己的主动技能如下
public class ActiveSkills implements ActiveSkill {
@Override
public void Activeskill() {
System.out.println("主动技能 : 插眼");
}
}
ok,准备工作完成,然后就是让自己的英雄可以q w e r外加插眼了!创建一个Hero类继承原先类并且让原先类里边的active有ActiveSkills里边的方法,如下:
public class Hero extends AllSkills{
public Hero()
{
active =new ActiveSkills();
}
}
最后便是添加一个Main类来实现他们了 如下:
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
AllSkills hero=new Hero();
hero.Qskill();
hero.Wskill();
hero.Eskill();
hero.Rskill();
hero.activekill();
}
}
我们的辅助终于拥有主动技能了!但是,我是一个有梦想的辅助,眼石什么的不存在的,只有我才能carry比赛!我要出贪欲九头蛇来为自己续航,输出!
没问题,java来满足你,简单实现如下:
创建一个NewSkill类implements 这个接口为新主动技能添加方法如下:
public class NewSkill implements ActiveSkill{
@Override
public void Activeskill() {
System.out.println("主动技能:贪欲九头蛇技能");
}
}
也不需要再重写一个类来继承父类什么的,只需要在原先父类里边再添加一个方法如下:
public void SetSkill(ActiveSkill active)
{
this.active=active;
}
然后直接在Main类里边修改就可以了,如下:
public class Main {
public static void main(String[] args) {
AllSkills hero=new Hero();
hero.Qskill();
hero.Wskill();
hero.Eskill();
hero.Rskill();
hero.activekill();
hero.SetSkill(new NewSkill());
hero.activekill();
}
}
这样你的辅助就拥有贪欲九头蛇技能了,是不是很简单呢?哈哈,身为一个辅助,你6神装的时候永远不知道你的ad四个格子还没出满你是多么的无奈,还是自己掌控比赛吧。。。。废话少说,记住少继承多组合的原则,记不住祝你当一个永远只会出眼石的辅助!
写这个的原因是为了让自己可以记住,写的不好还望大家见谅哈!