设计模式学习--适配器模式(Adapter Pattern)+外观模式(Facade Pattern)

学习福利

【Android 详细知识点思维脑图(技能树)】

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

小巫并不打算一口吃一个胖子,不认为一次就能学好设计模式,要做到灵活运用还是需要沉淀的,程序设计是一门艺术,对我来说是这样,我会一直不停的学习,让自己成为真正的高手。

关于适配器模式


3个对象要清楚:

  • 客户 (客户只看到目标接口)

  • 适配器 (适配器实现目标接口)

  • 被适配者 (所有的请求都委托给被适配器,与适配器组合)

再近一点:用火鸡来冒充鸭子


目标接口

package ducks;

/**

  • @author wwj

  • 适配器模式:鸭接口

*/

public interface Duck {

public void quack(); //呱呱叫

public void fly(); //飞行

}

目标接口具体实现类

package ducks;

/**

*@author wwj

*适配器模式:绿头鸭实现类

*/

public class MallardDuck implements Duck {

@Override

public void quack() {

System.out.println(“Quack”);

}

@Override

public void fly() {

System.out.println(“I’m flying”);

}

}

被适配对象接口

package ducks;

/**

  • @author wwj

  • 火鸡

*/

public interface Turkey {

public void gobble(); //咯咯叫

public void fly(); //火鸡也会飞,但飞不远

}

被适配对象接口具体实现类

package ducks;

/**

  • @author wwj

  • 火鸡具体实现类

*/

public class WildTurkey implements Turkey {

@Override

public void gobble() {

System.out.println(“Gobble gobble”);

}

@Override

public void fly() {

System.out.println(“I’m flying a short distance”);

}

}

适配器

package ducks;

/**

  • @author wwj

  • 适配器类:用火鸡来冒充鸭子

*/

public class TurkeyAdapter implements Duck {

Turkey turkey; //声明你需要适配的引用对象

/**

  • 取得需要适配的对象引用,这里通过构造器来取得这个引用

  • @param turkey

*/

public TurkeyAdapter(Turkey turkey) {

this.turkey = turkey;

}

@Override

public void quack() { //实现接口中的方法

turkey.gobble(); //用适配对象来转换需要实现的功能

}

@Override

public void fly() {

for(int i = 0; i < 5; i++) {

turkey.fly();

}

}

}

测试一下

package ducks;

public class TurkeyTestDrive {

public static void main(String[] args) {

WildTurkey turkey = new WildTurkey(); //创建一只火鸡

MallardDuck duck = new MallardDuck(); //创建一只鸭子

Turkey duckAdpter = new DuckAdapter(duck); //传进一个鸭子去,用来假装为火鸡

//测试鸭子

System.out.println(“The Duck says…”);

duck.quack();

duck.fly();

//测试火鸡

System.out.println(“\nThe Turkey says…”);

testTurkey(turkey);

//测试适配器

System.out.println(“\nThe duckAdapter says…”);

testTurkey(turkey);

}

private static void testTurkey(Turkey turkey) {

turkey.gobble();

turkey.fly();

}

}

适配器模式测试结果

The Turkey says…

Gobble gobble

I’m flying a short distance

The Duck says…

Quack

I’m flying

The TurkeyAdapter says…

Gobble gobble

I’m flying a short distance

I’m flying a short distance

I’m flying a short distance

I’m flying a short distance

I’m flying a short distance

好了,以上就是适配器模式的使用,下面是外观模式

关于外观模式


我们需要明白这个模式的意图是什么:简化接口,把复杂的子系统封装起来,可以使用户更加方便使用功能

一个外观模式的例子:家庭电影观赏


构造家庭影院外观

package hometheater;

public class HomeTheaterFacade {

//这就是组合,我们会用到的子系统组件全部都在这里

Amplifier amp;

Tuner tuner;

DvdPlayer dvd;

CdPlayer cd;

Projector projector;

TheaterLights lights;

Screen screen;

PopcornPopper popper;

/**

  • 外观将子系统每一个组件的引用都传入它的构造器中。然后外观把它们赋值给相应的实例变量

  • @param amp

  • @param tuner

  • @param dvd

  • @param cd

  • @param projector

  • @param lights

  • @param screen

  • @param popper

*/

public HomeTheaterFacade(Amplifier amp, Tuner tuner, DvdPlayer dvd,

CdPlayer cd, Projector projector, TheaterLights lights,

Screen screen, PopcornPopper popper) {

this.amp = amp;

this.tuner = tuner;

this.dvd = dvd;

this.cd = cd;

this.projector = projector;

this.lights = lights;

this.screen = screen;

this.popper = popper;

}

/**

  • 实现简化的接口

  • @param movie

*/

public void watchMovie(String movie) {

System.out.println(“Get ready to watch a movie…”);

popper.on();

popper.pop();

lights.dim(10);

screen.down();

projector.on();

projector.wideScreenMode();

amp.on();

amp.setDvd(dvd);

amp.setSurroundSound();

amp.setVolume(5);

dvd.on();

dvd.play(movie);

}

public void endMovie() {

System.out.println(“Shutting movie theater down…”);

popper.off();

lights.on();

screen.up();

projector.off();

amp.off();

dvd.stop();

dvd.eject();

dvd.off();

}

public void listenToCd(String cdTitle) {

System.out.println(“Get ready for an audiopile experence…”);

lights.on();

amp.on();

amp.setVolume(5);

amp.setCd(cd);

amp.setStereoSound();

cd.on();

cd.play(cdTitle);

}

public void endCd() {

System.out.println(“Shutting down CD…”);

amp.off();

amp.setCd(cd);

cd.eject();

cd.off();

}

public void listenToRadio(double frequency) {

System.out.println(“Tuning in the airwaves…”);

tuner.on();

tuner.setFrequency(frequency);

amp.on();

amp.setVolume(5);

amp.setTuner(tuner);

}

public void endRadio() {

System.out.println(“Shutting down the tuner…”);

tuner.off();

amp.off();

}

}

各个子系统类的实现

package hometheater;

public class Amplifier {

String description;

Tuner tuner;

DvdPlayer dvd;

CdPlayer cd;

public Amplifier(String description) {

this.description = description;

}

public void on() {

System.out.println(description + " on");

}

public void off() {

System.out.println(description + " off");

}

public void setStereoSound() {

System.out.println(description + " stereo mode on");

}

public void setSurroundSound() {

System.out.println(description + " surround sound on (5 speakers, 1 subwoofer)");

}

public void setVolume(int level) {

System.out.println(description + " setting volume to " + level);

}

public void setTuner(Tuner tuner) {

System.out.println(description + " setting tuner to " + dvd);

this.tuner = tuner;

}

public void setDvd(DvdPlayer dvd) {

System.out.println(description + " setting DVD player to " + dvd);

this.dvd = dvd;

}

public void setCd(CdPlayer cd) {

System.out.println(description + " setting CD player to " + cd);

this.cd = cd;

}

public String toString() {

return description;

}

}

package hometheater;

public class CdPlayer {

String description;

int currentTrack;

Amplifier amplifier;

String title;

public CdPlayer(String description, Amplifier amplifier) {

this.description = description;

this.amplifier = amplifier;

}

public void on() {

System.out.println(description + " on");

}

public void off() {

System.out.println(description + " off");

}

public void eject() {

title = null;

System.out.println(description + " eject");

}

public void play(String title) {

this.title = title;

currentTrack = 0;

System.out.println(description + " playing “” + title + “”");

}

public void play(int track) {

if (title == null) {

System.out.println(description + " can’t play track "

  • currentTrack + “, no cd inserted”);

} else {

currentTrack = track;

System.out.println(description + " playing track " + currentTrack);

}

}

public void stop() {

currentTrack = 0;

System.out.println(description + " stopped");

}

public void pause() {

System.out.println(description + " paused “” + title + “”");

}

public String toString() {

return description;

}

}

package hometheater;

public class DvdPlayer {

String description;

int currentTrack;

Amplifier amplifier;

String movie;

public DvdPlayer(String description, Amplifier amplifier) {

this.description = description;

this.amplifier = amplifier;

}

public void on() {

System.out.println(description + " on");

}

public void off() {

System.out.println(description + " off");

}

public void eject() {

movie = null;

System.out.println(description + " eject");

最后

针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

  • Android前沿技术大纲

  • 全套体系化高级架构视频

Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、混合式开发(ReactNative+Weex)全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

ing description, Amplifier amplifier) {

this.description = description;

this.amplifier = amplifier;

}

public void on() {

System.out.println(description + " on");

}

public void off() {

System.out.println(description + " off");

}

public void eject() {

movie = null;

System.out.println(description + " eject");

最后

针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

  • Android前沿技术大纲

    [外链图片转存中…(img-L6cFbGcW-1715472503061)]

  • 全套体系化高级架构视频

    [外链图片转存中…(img-jXP8mLCo-1715472503062)]

Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、混合式开发(ReactNative+Weex)全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 12
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值