设计模式观察者模式

1.观察者模式的概念跟应用状况
观察者模式是一个使用率挺大之模式,它不过常用的地方是GUI系统,订阅-发布网。因为这个模式之一个最主要作用就是是解耦,将让观察者和观察者解耦,使得其中的依赖更粗。
定义:
概念对象中一种植同等针对多的依靠关系,使得以一个对象改变状态,则就此依赖让它们的靶子还见面获关照并叫自动更新
动用状况:
论及行为现象,需要注意的是,关联行为经常可拆分的,而未是“组合”关系;
事件多级触发场景
越系统的音信交换场景,如信息队列、事件总线的拍卖机制

                                                                 
“没有一身鳞伤,哪能存得好”

Paste_Image.png

“在鹿晗的神韵里,终究是温和大过勇猛的。或者说,他当向世界之千姿百态没有攻击性,只会以公看不显现的地方发力,举重若轻的扛起了全副。

2. 观察者模式之优缺点
2.1优点
观察者和被观察者之间是空虚解耦,应针对业务转移
加强系统灵活性、可扩展性
2.2缺点
在运用观察者模式时要考虑一下开发效率与运行效率问题,程序中连一个被观察者、多个观察者、开发及调节等情节会比较复杂,而且于Java中信息的关照默认是各个执行,一个观察者卡顿,会影响整体的实施效率,在这种状况下,一般考虑采取异步的点子
3. 观察者模式之兑现方式

他会受您明白,真正的劲是啊。”

public interface Observer {
    //更新方法
    public void  update();
}```

旋即是鹿晗粉丝评价鹿晗的等同段子话。

public class ConcreteObsever implements Observer {
@Override
public void update() {
System.out.println(“接收到信息,并开展拍卖!”);
}
}“`

每当诸多外人面前,鹿晗的颜值和神韵总是让津津乐道,他表面所透露的少年气死轻就能够唤起他人之好感。

public abstract class Subject {
    //定义一个观察者数组
    private List<Observer> observers = new ArrayList<>();
    //增加一个观察者
    public void addObserver(Observer o) {
        this.observers.add(o);
    }
    //删除一个观察者
    public void removeObserver(Observer o) {
        this.observers.remove(o);
    }
    //通知所有观察者
    public void notifyObservers() {
        for (Observer o : this.observers) {
            o.update();
        }
    }
}```

27岁的鹿晗,像许多人口年轻里之那位翩翩少年,频繁之活跃于银幕上,让观众如痴如醉。

public class ConcreteSubject extends Subject {
//具体的事务
public void doSomeThing() {
super.notifyObservers();
}
}“`

只是他的胸早早的哪怕深受种与韧劲所代替,是一个尽的“纯爷们”

public class Test {
    public static void main(String args[]) {
      //创建一个被观察者
        ConcreteSubject subject=new ConcreteSubject();
        Observer obs=new ConcreteObsever();
        subject.addObserver(obs);
        subject.doSomeThing();
    }
}```
**4. 观察者模式在Android中的实际应用**
RecycleView是Android中最重要的控件之一,而RecycleView最重要的一个功能就是Adapter。通过我们往RecycleView添加数据后,都会调用Adapter的notifyDataSetChanged()方法,这是为什么?
首先我们看下Adapter的实现,他是RecycleView的一个内部类。

他未见面为丁老以及世俗的疲劳感,脸上其他的大悲大喜都给人倍感体贴入微和方正。

public static abstract class Adapter<VH extends ViewHolder> {
private final AdapterDataObservable mObservable = new
AdapterDataObservable();
private boolean mHasStableIds = false;
public abstract VH onCreateViewHolder(ViewGroup parent, int viewType);
public abstract void onBindViewHolder(VH holder, int position);
public void onBindViewHolder(VH holder, int position, List<Object>
payloads) {
onBindViewHolder(holder, position);
}
public final VH createViewHolder(ViewGroup parent, int viewType) {
TraceCompat.beginSection(TRACE_CREATE_VIEW_TAG);
final VH holder = onCreateViewHolder(parent, viewType);
holder.mItemViewType = viewType;
TraceCompat.endSection();
return holder;
}
public final void bindViewHolder(VH holder, int position) {
holder.mPosition = position;
if (hasStableIds()) {
holder.mItemId = getItemId(position);
}
holder.setFlags(ViewHolder.FLAG_BOUND,
ViewHolder.FLAG_BOUND | ViewHolder.FLAG_UPDATE |
ViewHolder.FLAG_INVALID
| ViewHolder.FLAG_ADAPTER_POSITION_UNKNOWN);
TraceCompat.beginSection(TRACE_BIND_VIEW_TAG);
onBindViewHolder(holder, position, holder.getUnmodifiedPayloads());
holder.clearPayload();
TraceCompat.endSection();
}
public int getItemViewType(int position) {
return 0;
}
public void setHasStableIds(boolean hasStableIds) {
if (hasObservers()) {
throw new IllegalStateException(“Cannot change whether this adapter has
” +
“stable IDs while the adapter has registered observers.”);
}
mHasStableIds = hasStableIds;
}
public long getItemId(int position) {
return NO_ID;
}
public abstract int getItemCount();
public final boolean hasStableIds() {
return mHasStableIds;
}
public void onViewRecycled(VH holder) {
}
public boolean onFailedToRecycleView(VH holder) {
return false;
}
public void onViewAttachedToWindow(VH holder) {
}
public void onViewDetachedFromWindow(VH holder) {
}
public final boolean hasObservers() {
return mObservable.hasObservers();
}
public void registerAdapterDataObserver(AdapterDataObserver observer)
{
mObservable.registerObserver(observer);
}
public void unregisterAdapterDataObserver(AdapterDataObserver observer)
{
mObservable.unregisterObserver(observer);
}
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
}
public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
}
public final void notifyDataSetChanged() {
mObservable.notifyChanged();
}
public final void notifyItemChanged(int position) {
mObservable.notifyItemRangeChanged(position, 1);
}
public final void notifyItemChanged(int position, Object payload) {
mObservable.notifyItemRangeChanged(position, 1, payload);
}
public final void notifyItemRangeChanged(int positionStart, int
itemCount) {
mObservable.notifyItemRangeChanged(positionStart, itemCount);
}
public final void notifyItemRangeChanged(int positionStart, int
itemCount, Object payload) {
mObservable.notifyItemRangeChanged(positionStart, itemCount, payload);
}
public final void notifyItemInserted(int position) {
mObservable.notifyItemRangeInserted(position, 1);
}
public final void notifyItemMoved(int fromPosition, int toPosition) {
mObservable.notifyItemMoved(fromPosition, toPosition);
}
public final void notifyItemRangeInserted(int positionStart, int
itemCount) {
mObservable.notifyItemRangeInserted(positionStart, itemCount);
}
public final void notifyItemRemoved(int position) {
mObservable.notifyItemRangeRemoved(position, 1);
}
public final void notifyItemRangeRemoved(int positionStart, int
itemCount) {
mObservable.notifyItemRangeRemoved(positionStart, itemCount);
}
}“`
咱俩可见到notifyDataSetChange()中调用了mObservable.notifyChange()。继续看AdapterDataObservable类

陈数都评论鹿晗身上发生十分难得的威仪一一松弛

static class AdapterDataObservable extends Observable<AdapterDataObserver> {
public boolean hasObservers() {
return !mObservers.isEmpty();
}
public void notifyChanged() {
for (int i = mObservers.size() - 1; i >= 0; i--) {
mObservers.get(i).onChanged();
}
}
public void notifyItemRangeChanged(int positionStart, int itemCount) {
notifyItemRangeChanged(positionStart, itemCount, null);
}
public void notifyItemRangeChanged(int positionStart, int itemCount, Object payload) {
for (int i = mObservers.size() - 1; i >= 0; i--) {
mObservers.get(i).onItemRangeChanged(positionStart, itemCount, payload);
}
}
public void notifyItemRangeInserted(int positionStart, int itemCount) {
for (int i = mObservers.size() - 1; i >= 0; i--) {
mObservers.get(i).onItemRangeInserted(positionStart, itemCount);
}
}
public void notifyItemRangeRemoved(int positionStart, int itemCount) {
for (int i = mObservers.size() - 1; i >= 0; i--) {
mObservers.get(i).onItemRangeRemoved(positionStart, itemCount);
}
}
public void notifyItemMoved(int fromPosition, int toPosition) {
for (int i = mObservers.size() - 1; i >= 0; i--) {
mObservers.get(i).onItemRangeMoved(fromPosition, toPosition, 1);
}
}
}```
Observable是一个被观察者:

“事实上,很多人口新入社会,都想做好,但也时有发生无数惊恐和心烦意乱,很为难完成松弛,这是自身成熟之后慢慢好的。

public abstract class Observable<T> {
/**

可自我以外随身看出了,更珍贵之是外的松散也被自身松弛。

  • The list of observers. An observer can be in the list at most
  • once and will never be null.
    /
    protected final ArrayList<T> mObservers = new
    ArrayList<T>();
    /
    *
  • Adds an observer to the list. The observer cannot be null and it
    must not already
  • be registered.
  • @param observer the observer to register
  • @throws IllegalArgumentException the observer is null
  • @throws IllegalStateException the observer is already registered
    /
    public void registerObserver(T observer) {
    if (observer == null) {
    throw new IllegalArgumentException(“The observer is null.”);
    }
    synchronized(mObservers) {
    if (mObservers.contains(observer)) {
    throw new IllegalStateException(“Observer ” + observer + ” is
    already registered.”);
    }
    mObservers.add(observer);
    }
    }
    /
    *
  • Removes a previously registered observer. The observer must not be
    null and it
  • must already have been registered.
  • @param observer the observer to unregister
  • @throws IllegalArgumentException the observer is null
  • @throws IllegalStateException the observer is not yet registered
    /
    public void unregisterObserver(T observer) {
    if (observer == null) {
    throw new IllegalArgumentException(“The observer is null.”);
    }
    synchronized(mObservers) {
    int index = mObservers.indexOf(observer);
    if (index == -1) {
    throw new IllegalStateException(“Observer ” + observer + ” was not
    registered.”);
    }
    mObservers.remove(index);
    }
    }
    /
    *
  • Remove all registered observers.
    */
    public void unregisterAll() {
    synchronized(mObservers) {
    mObservers.clear();
    }
    }
    }“`
    AdapterDataObserver 的派生类RecyclerViewDataObserver:
    mObserver是RecycleView的一个变量

他虽尚无正儿八经的训练,但拍摄时能成功真正、松弛,事实上他于自己想象得还要好。

鹿晗,看似没心没肺,没有其他攻击性,但他的勋章背后,是对友好从未有过松懈,敢于下狠劲。

private final RecyclerViewDataObserver mObserver = new RecyclerViewDataObserver();```

甭管是粉丝或媒体,脸蛋精致清秀的鹿晗总会为冠以“萌”、“可爱”、“腼腆”这样的形容词,而这刚好是他非爱好的。

private class RecyclerViewDataObserver extends AdapterDataObserver {
@Override
public void onChanged() {
assertNotInLayoutOrScroll(null);
if (mAdapter.hasStableIds()) {
// TODO Determine what actually changed.
// This is more important to implement now since this callback will
disable all
// animations because we cannot rely on positions.
mState.mStructureChanged = true;
setDataSetChangedAfterLayout();
} else {
mState.mStructureChanged = true;
setDataSetChangedAfterLayout();
}
if (!mAdapterHelper.hasPendingUpdates()) {
requestLayout();
}
}
@Override
public void onItemRangeChanged(int positionStart, int itemCount, Object
payload) {
assertNotInLayoutOrScroll(null);
if (mAdapterHelper.onItemRangeChanged(positionStart, itemCount,
payload)) {
triggerUpdateProcessor();
}
}
@Override
public void onItemRangeInserted(int positionStart, int itemCount) {
assertNotInLayoutOrScroll(null);
if (mAdapterHelper.onItemRangeInserted(positionStart, itemCount)) {
triggerUpdateProcessor();
}
}
@Override
public void onItemRangeRemoved(int positionStart, int itemCount) {
assertNotInLayoutOrScroll(null);
if (mAdapterHelper.onItemRangeRemoved(positionStart, itemCount)) {
triggerUpdateProcessor();
}
}
@Override
public void onItemRangeMoved(int fromPosition, int toPosition, int
itemCount) {
assertNotInLayoutOrScroll(null);
if (mAdapterHelper.onItemRangeMoved(fromPosition, toPosition,
itemCount)) {
triggerUpdateProcessor();
}
}
void triggerUpdateProcessor() {
if (mPostUpdatesOnAnimation && mHasFixedSize && mIsAttached) {
ViewCompat.postOnAnimation(RecyclerView.this,
mUpdateChildViewsRunnable);
} else {
mAdapterUpdateDuringMeasure = true;
requestLayout();
}
}
}“`
RecycleView的setAdapter方法,可以见见里边调用了unregisterAdapterDataObserver及registerAdapterDataObserver方法进行取消注册及注册。

“因为自己自己是纯爷们性格。”鹿晗以征集遭接二连三坚定的为温馨澄清。

public void setAdapter(Adapter adapter) {
 // bail out if layout is frozen
 setLayoutFrozen(false);
 setAdapterInternal(adapter, false, true);
 requestLayout();
 }
private void setAdapterInternal(Adapter adapter, boolean compatibleWithPrevious,
 boolean removeAndRecycleViews) {
 if (mAdapter != null) {
 mAdapter.unregisterAdapterDataObserver(mObserver);
 mAdapter.onDetachedFromRecyclerView(this);
 }
 if (!compatibleWithPrevious || removeAndRecycleViews) {
 // end all running animations
 if (mItemAnimator != null) {
 mItemAnimator.endAnimations();
 }
 // Since animations are ended, mLayout.children should be equal to
 // recyclerView.children. This may not be true if item animator's end does not work as
 // expected. (e.g. not release children instantly). It is safer to use mLayout's child
 // count.
 if (mLayout != null) {
 mLayout.removeAndRecycleAllViews(mRecycler);
 mLayout.removeAndRecycleScrapInt(mRecycler);
 }
 // we should clear it here before adapters are swapped to ensure correct callbacks.
 mRecycler.clear();
 }
 mAdapterHelper.reset();
 final Adapter oldAdapter = mAdapter;
 mAdapter = adapter;
 if (adapter != null) {
 adapter.registerAdapterDataObserver(mObserver);
 adapter.onAttachedToRecyclerView(this);
 }
 if (mLayout != null) {
 mLayout.onAdapterChanged(oldAdapter, mAdapter);
 }
 mRecycler.onAdapterChanged(oldAdapter, mAdapter, compatibleWithPrevious);
 mState.mStructureChanged = true;
 markKnownViewsInvalid();
 }```
到这里我们知道,setAdapter()方法会进行观察者的注册,当RecycleView的数据发送变化的时,调用了Adapter的notifyDataSetChange(),这个函数又会调用 AdapterDataObservable的notifyChanged();该函数会遍历所有的观察者的onChange函数,在 RecyclerViewDataObserver的onChange()函数中会获取Adapter中数据集的新数量,然后调用RecycleView的requestLayout()方法重新进行布局,更新用户的界面。这就是一个观察者模式!
出处:http://huangjunbin.com/page/2/

“腼腆啊,可能特别时代自己也许未顶想说嘎巴,可能吧从不什么会说,没有机会展现出来吃大家看。

横自己平常是死行笑的,挺逗的一个丁。我吗会见以及身边的工作人员开玩笑什么,逗啊,闹啊之类的。”

当娱乐圈里,和鹿晗合作了之很多星为为外“打抱不均等”,在评论鹿晗时还认可了外的“爷们”个性。

邓超对鹿晗印象格外好。“他那个有礼,不咋样无及早,特别爷们儿,我们中间为生广大底赛璐珞反应。

外于组织里每个人特别强调,玩游戏又投入,团队发出了他,真的是蓬荜生辉。”

马思纯大方的代表对鹿晗有保护欲。“小鹿就是自始终想看他,他最像孩童了,多动症,永远停不下来。

外专门爱跳舞,无论站于哪都如扭转两下,坐在吧如动区区产,永远停不下来。

新兴复失去《跑男》的时,对他的记忆有改观,因为《跑男》在泥塘录制好麻烦,但特别时刻小鹿很爷们儿,北京小哥的含意特别浓厚。”

当一个纯爷们,鹿晗有丰富活动细胞,善于足球,篮球、轮滑、跨栏、保龄球、台球、乒乓球、橄榄球等其他体育运动。

2006年,就读北京海淀外国语实验学校的鹿晗,酷爱足球运动,是曼联的忠贞球迷。

其时,他靠速度快协调性好,作为年级足球队长,率领年级球队夺得学校足球比赛冠军

当2013年之上海“亚洲梦想杯”中韩慈善足球赛达到,鹿晗代表上海老克勒明星队出场,表现出色,获得了生意球员范志毅、沈晗顶人口之称。

“我觉着以业余球员中,鹿晗的水准算是顶尖的了。”

“速度迅猛,和融洽年轻的时候基本上。”

“会踢球,跑个、传球都还不易,而且特别敬业。”

2008年,未满18岁的鹿晗赴韩国留学,在延世大学韩国语学堂读书韩语,

立马,鹿晗是趟上年龄最小的,偶上课分心了师会重罚他唱给全班听,他吗会大方地唱。

后来他经过了韩语等级考试,并当2009年考入首尔综合艺术高校实用音乐艺术系。

鹿晗表示,当初择留学是坐他那个爱韩国一个成,一直抱有成为明星的心愿,他针对性韩国是英雄的造星工厂充满希望。

幸运的凡,留学期间,他以及情人在明洞闲逛街时叫SM娱乐公司之星探发掘。

“当时遇见的那么个人吗没有于自身名片,只留下了一个电话号码,我还当是诈骗者也!”

自从进SM到成为SM的练习生,中间闹有限年之流年他还在等待。

他说:“等待太老,长之受人口忘怀一从头等候的意义。”

自从迷茫到逐渐坚定目标,2010年,鹿晗通过S.M.Casting
System,终于成海下练习生。

韩国练习生的魔鬼训练相信大家还有着耳闻,当时之鹿晗每天最好怀念做的政工,除了训练就是睡眠。

发段子时日外身体透支,哮喘病犯了,但为了形成每天的训练量,他想生了一个措施:

于起居室内准备一个小桶,每天练习结束将装拧干,汗水装满半桶才算是过得去。

“我会尽量放低对结果的要,但切莫见面降对协调之渴求,会全力。”

外的坚持没有辜负倔强。2012年4月,鹿晗以韩国男子组合EXO/EXO-M成员正式出道,在组合内任主唱、领舞、门面担当

“我欣赏曼联,就是因她们更过无数非常频繁反败为胜,用今天之布道被“逆袭”,我喜欢这种感觉。”

有人说他极度愚笨,去盼望一个未知之明,去坚持所有无用的自我牺牲,可他偏偏就水到渠成了。

由整合受限,公司无法提供未来向上计划、身体也在强强度工作和压力下出现病症

以24春秋本命年底当儿,鹿晗以及sm公司申请解约,毅然决然的放弃开起前面之大成回到出生地,还开始

一个月份后的外,陆续对接打了《重返20秋》、《我是见证》、《长城》、《择天记》相当作品,每次尝试新角色,鹿晗的表现还无为人口大失所望。

趁鹿晗的人气不断升高,他变成了首各上上《福布斯》杂志中文版封面的90后。

被选入2016年度“中国留学人员创新创业50口榜单”,鹿晗为是该榜单首蹩脚面世的90继。

荣膺中国新闻周刊主办的“影响中国2016岁演艺人士”奖项,再次成第一只获这荣誉的90继。

回国后底鹿晗,音乐,电影,电视剧,广告代言不绝,拿奖拿到爱心,其中接连取得甚微单万能艺人奖

然而采访中,他谦虚之代表:“还免可知如得及全能。”

杨幂就这么评价鹿晗:“他来多动症,永远精力旺盛,即使撞到凌晨也生饱满,永远噼里啪啦的。

“他尽管受伤,但一心无会见拿个人情绪带及打里。这么红还是如此努力,敬业程度超出想像。

世家都不过望稍微鲜肉有多吉,多受粉丝欢迎,而忽视了偷他们提交的极力。”

鲁迅说罢:“这世上本没有路,走之程多了,也就算成了行程。”

鹿晗留学之初衷并未外特别意义,仅仅是一个,很多人数还已经有的“明星梦”。

但他即使是多了那么点自信,那么点倔强,那么点狠劲,才走来了平等久独一无二的里程。

                                                                   鹿晗《勋章》**

                                                       
  武器就是是我持的愿意

                                                                 
而自我为了的祸害

                                                                 
都是自之勋章

                                                       
 是孰说伟大才值得被赞美

                                                       
 乘风扫除浪后为未见面必成功

                                                                 
生命只能上

                                                           
 坚定信念的人头都是英雄