Você está na página 1de 20

PROGRAMAO ORIENTADA A ASPECTOS

Uma Viso Geral Alexandre Henrique Vieira Soares Anderson de Rezende Rocha Flvio Luis Alves Jlio Csar Alves {ahvsoares, undersun, alves, jcalves}@comp.ufla.br Departamento de Cincia da Computao Universidade Federal de Lavras Resumo Este artigo prope uma viso geral sobre o paradigma de programao orientada a aspectos, atravs da definio de aspectos genricos.

Este paradigma pode ser aplicado a linguagens orientadas a objeto atravs da implementao das abstraes para a representao de aspectos e de uma ou mais estratgias de implementao do modelo. Apresenta-se tambm, nos anexos, uma breve descrio da ferramenta Aspect-J, especializada em programao orientada a aspectos.

Abstract This paper intends a overview about the aspect oriented programming paradigm, through the definition of generic aspects. This paradigm can be applied to object-oriented languages by the implementation of the abstractions for aspects and one or more strategies defined in the model.

It presents, as a append, a brief description of Aspect-J tool, that is proper to aspect oriented programming.

Introduo A engenharia de software e as linguagens de programao coexistem em um relacionamento de suporte mtuo. A maioria dos processos de desenvolvimento de software da atualidade considera um sistema com unidades cada vez menores de desenvolvimento.

Diz-se que a engenharia de software prov as bases tericas para o bom desenvolvimento de software, por outro lado as linguagens de programao permitem a abstrao de unidades e composio destas de inmeras formas possveis de forma que, agrupando-as consiga-se um todo bem definido ou ainda mais que este (sinergia).

Figura 1

Sabe-se que no desenvolvimento de software existem propriedades que no se enquadram em componentes da decomposio funcional, tais como: tratamento de excees, restries de tempo real, distribuio e controle de concorrncia. Elas normalmente esto espalhadas em diversos componentes do sistema afetando a performance ou a semntica da aplicao.

Embora elas possam ser visualizadas e analisadas relativamente em separado, sua implementao utilizando linguagens orientadas a objeto ou estruturadas torna-se confusa e seu cdigo encontra-se espalhado atravs do cdigo da aplicao, dificultando a separao da funcionalidade bsica do sistema dessas propriedades.

A programao orientada a aspectos uma abordagem que permite a separao dessas propriedades ortogonais dos componentes funcionais de uma forma natural e concisa,

utilizando-se de mecanismos de abstrao e de composio para a produo de cdigo executvel. Atualmente conhece-se vrios problemas de programao em que as tcnicas de programao orientadas a objetos ou de programao estruturada no so suficientes para separar claramente todas as decises de projeto que o programa deve implementar.

Isto se deve ao fato de que as abordagens mais utilizadas concentram-se em encontrar e compor unidades funcionais da decomposio do sistema, enquanto que outras questes importantes no so bem localizadas no projeto funcional. Exemplos disto podem ser propriedades que envolvem vrias unidades funcionais, tais como: sincronizao, restries de tempo, concorrncia, distribuio de objetos, persistncia, etc.

Quando duas propriedades sendo programadas devem ser compostas de maneira diferente e ainda coordenarem-se dito que elas so ortogonais entre si.

Aspectos versus Componentes Uma propriedade de um sistema que deve ser implementada pode ser vista como um componente ou como um aspecto:

A propriedade pode ser vista como um componente se puder ser encapsulada em um procedimento generalizado (objeto, mtodo, procedimento, API). Os

componentes tendem a ser unidades da decomposio funcional do sistema. Como exemplos, podem ser citados: contas bancrias, usurios ou mensagens.

Aspectos no so normalmente unidades da decomposio funcional do sistema, mas sim propriedades que envolvem diversas unidades de um sistema, afetando a semntica dos componentes funcionais sistematicamente.

Pode-se citar vrios exemplos de aspectos, tais como: controle de concorrncia em operaes em uma mesma conta bancria, registro das transaes de uma determinada conta, poltica de segurana de acesso aos usurios de um sistema, restries de tempo real associadas entrega de mensagens.

Dada a definio de componentes e aspectos, possvel colocar o objetivo da programao orientada a aspectos: oferecer suporte para o programador na tarefa de separar claramente os componentes dos aspectos, os componentes entre si e os aspectos entre si, utilizando-se de mecanismos que permitam a abstrao e composio destas, produzindo o sistema desejado . A programao orientada a aspectos estende outras tcnicas de programao (orientada a objetos, estruturada, etc.) que oferecem suporte apenas para separar componentes entre si abstraindo e compondo-os para a produo do sistema desejado.

A implementao de aspectos

Uma implementao baseada no paradigma de programao orientada a aspectos composta normalmente de:

Uma linguagem de componentes para a programao de componentes; Uma ou mais linguagens de aspectos para a programao de aspectos; Um combinador de aspectos (aspect weaver) para a combinao das linguagens; Um programa escrito na linguagem de componentes; Um ou mais programas escritos na linguagem de aspectos.

Figura 2

Componentes

Os componentes no contexto da programao orientada a aspectos so abstraes providas pela linguagem que permitem a implementao da funcionalidade do sistema. Logo

procedimentos, funes, classes, objetos, procedimentos so denominados de componentes em programao orientada a aspectos. Eles originam-se da decomposio funcional de um sistema, independentes de a linguagem ser orientada a objetos ou estruturada. A programao orientada a aspectos no restrita ou delimitada pela orientao a objetos, ela estende o modelo.

Aspectos

Propriedades de um sistema envolvendo diversos componentes funcionais no podem ser expressas utilizando as notaes e linguagens atuais de uma maneira bem localizada (tais como: sincronizao, interao entre componentes, distribuio, persistncia).

Estas propriedades so expressas atravs de fragmentos de cdigo espalhados por diversos componentes do sistema.

Algumas tratamento

propriedades de

que

normalmente de

so

vistas

como objetos,

aspectos

em

relao

funcionalidade bsica da aplicao: sincronizao de objetos concorrentes, distribuio, excees, coordenao segurana, mltiplos persistncia, tolerncia serializao, falhas,

atomicidade,

replicao,

visualizao,

logging,

tracing,

obteno de mtricas, dentre outras.

Um simples exemplo de aspecto

Figura 3

Tem-se na figura acima a definio de dois tipos de figura, ponto e linha. A posio do ponto e da linha definida atravs de duas coordenadas (x e y). Deste modo ambas permitem acesso aos valores de x e y (sua posio) atravs das funes getX() e getY().

Alm disso, pode-se modificar a posio de um ponto ou linha, modificando-se a posio na coorenada x (setX), na coordenada y (setY) ou as duas ao mesmo tempo (incrXY). Nota-se ento que movimentar um ponto ou uma linha feito da mesma maneira nos dois tipos de figura.

Com isso, percebe-se que existe um aspecto movimento , definido tanto para linha quanto para o ponto. Ou seja, deve-se encapsular o aspecto movimento em um s lugar.

Na verdade, o movimento est definido para uma figura e redefinido para a outra. Assim um tratamento de exceo que diz, por exemplo, que no se pode ter x ou y negativos definido duas vezes. Da mesma forma para os valores mximos de x e y.

importante notar tambm as vantagens desta definiao do aspecto movimento em relao reutilizao de software. Por exemplo:

Suponha que sem a utilizao de aspecto, x e y mximos foram definidos como 1000 e foi implementado todo um tratamento de exceo quanto a isso em cada classe. Suponha agora que algum pretende reaproveitar este cdigo em outro software. Mas neste as coordenadas mximas sero (1500, 1500). Como a implementao anterior no utilizou a abordagem de aspectos, todo o tratamento de exceo anteriormente previsto para as coordenadas (1000, 1000) dever ser redefinido para cada classe. Entretanto se a abordagem de aspecto houvesse sido considerada para a definio de movimento, bastaria redefinir apenas em nico local, na definio do aspecto. Deste modo percebe-se que a orientao a aspectos prope sobre a orientao a objetos algo como o que a orientao a objetos props sobre a programao estruturada, ou seja, elementos comuns devem ser encapsulados em um s local para uma melhor definio e manutenibilidade.

Linguagem de aspectos

A linguagem de aspectos deve suportar a implementao das propriedades desejadas de forma clara e concisa, fornecendo construes necessrias para que o programador crie estruturas que descrevam o comportamento dos aspectos e definam em que situaes eles ocorrem. Requisitos que devem ser observados na especificao de uma linguagem de aspectos:

Sua sintaxe deve ser fortemente relacionada com a da linguagem de componentes, de maneira a facilitar o aprendizado e obter maior aceitao por parte dos desenvolvedores;

A linguagem deve ser projetada para especificar o aspecto de maneira concisa e compacta. Normalmente as linguagens de aspecto so de mais alto nvel de abstrao que as linguagens de programao de uso geral;

Sua gramtica deve possuir elementos que permitam ao combinador compor os programas escritos usando as linguagens de aspectos e componentes.

Combinador de aspectos O processo de combinao realizado pelo combinador de aspectos o produto do cruzamento de um ou mais aspectos com os componentes descritos na linguagem de componentes.

A funo do combinador de aspectos processar a linguagem de aspectos e a de componentes, compondo essas linguagens corretamente a fim de produzir a operao geral desejada.

O projeto de um sistema orientado a aspectos requer o entendimento sobre o que deve ser descrito na linguagem de componentes e de aspectos, bem como as caractersticas que so compartilhadas entre elas.

Mecanismos de Composio

Herana, parametrizao e chamadas de funes so exemplos de mecanismos de composio. Os mecanismos de composio de aspectos, segundo devem permitir

(idealmente) os seguintes requisitos:

Fraco acoplamento: Os aspectos devem possuir o mnimo possvel de ligaes com os componentes;

Adio no invasiva de aspectos ao cdigo existente: a capacidade de adaptar um componente ou um aspecto sem modific-lo manualmente.

Tecnologias de implementao para programao orientada a aspectos: Prover suporte para aspectos envolve duas etapas: implementar abstraes para expressar aspectos e implementar um combinador para compor o cdigo de aspectos com o de componentes. Para a implementao de abstraes que permitam expressar aspectos de maneira concisa e simples,existem duas abordagens principais:

A primeira delas consiste em codificar o suporte a aspectos como uma biblioteca convencional.

A segunda projetar uma linguagem especfica para o aspecto, implementada atravs de um pr-processador, compilador ou interpretador.

Existem diversas abordagens que se concentram em encapsular propriedades que so ortogonais s unidades funcionais do sistema. Estas abordagens estendem o modelo de programao orientado a objeto, fornecendo mecanismos para a descrio de propriedades que so ortogonais a funcionalidade bsica do sistema.

Filtros de composio (Composition Filters)

Filtros de composio uma tcnica de programao orientada a aspectos onde diferentes aspectos so expressos em filtros, de maneira declarativa, juntamente com especificaes para a transformao de mensagens. Esta abordagem permite ao desenvolvedor expressar aspectos de uma forma geral atravs do uso de filtros e possibilita sua composio sem a necessidade da construo de geradores especficos. Os filtros de composio podem ser anexados a objetos de diferentes linguagens orientadas a objeto. Nesta abordagem as mensagens que chegam a um objeto so avaliadas e, se necessrio, manipuladas pelos filtros que atuam sobre aquele objeto. Estes filtros podem ser anexados a linguagens orientadas a objeto, sem a necessidade de modific-las.

A linguagem de componentes utilizada nesta abordagem uma linguagem orientada a objetos e a linguagem de aspectos o mecanismo de filtros de composio. A maioria do processo de combinao ocorre em tempo de execuo. Nesta abordagem os pontos de combinao so o envio e recebimento de mensagens por parte de um objeto.

So exemplos de ferramentas/linguagens de suporte a programao orientada a aspectos: HyperJ, QIDL, AOP/ST, linguagem de sincronizao de processos, linguagem detracing, AspectJ, D, COOL, RIDL, IL, D2AL, JST, AspectIX.

Abstraes para a representao de aspectos De forma geral, como o paradigma de orientao a aspectos est ainda em sua infncia , a abstrao de aspectos est atrelada orientao a objetos. Assim se constri um conjunto de classes inter-relacionadas que fornecem mecanismos para representar aspectos em uma aplicao.

Objetos destas classes so referenciados e utilizados da mesma forma que outros objetos no sistema, com a particularidade de que no so feitas chamadas para mtodos ou propriedades destes pelos componentes da aplicao.

Um aspecto pode estar presente em diversas classes, podendo atuar em diversos eventos do sistema. Ao ser inserido na aplicao, necessria sua associao com as classes com os quais ele interage. Cada aspecto possui diversos pontos de atuao (pointcuts) que determinam um conjunto de situaes (pontos de combinao) e um conjunto de aes que devem ser tomadas no decorrer de cada situao.

A seguir tm-se algumas definies no escopo da programao orientada a aspectos. Mais sobre estas definies pode ser encontrada nos anexos. Pointcuts e Joinpoints

Para entender o que um pointcut, necessrio saber primeiro o que um joinpoint. Joinpoints representam pontos bem definidos na execuo de um programa. Joinpoints tpicos podem ser, por exemplo, chamadas a mtodos, acessos a membros. Joinpoints podem conter outros joinpoints .

Pointcut uma contruo de linguagem que junta um cojunto de joinpoints baseando-se em um critrio bem definido. Advice

Agora que o aspecto definiu os pontos a serem linkados usado o advice para completar a implementao. Advice o trecho de cdigo que executado antes, depois e simultaneamnete a um joinpoint.

algo como rode tal cdigo antes de todos os mtodos que eu escrever um log.

Por que usar o paradigma de orientao a aspectos? Uma vantagem na utilizao da orientao a aspectos est na diminuio do tamanho do cdigo dos componentes (visto que uma parte do cdigo fica na definio dos aspectos), diminuindo sua complexidade.

Por estar centralizado em uma nica unidade, alteraes so muito mais simples, no preciso reescrever inmeras classes. claro que um cdigo mais conciso facilita sua manutenibilidade e reusabilidade.

Por que ningum usa este paradigma? Apesar de apresentar uma proposta inovadora no desenvolvimento de software pode-se dizer que a Orientao a Aspectos, apesar de sua constante evoluo, ainda deixa a desejar em alguns pontos tais como:

No h um meio claro para se definir o que deve e o que no deve ser um aspecto em um projeto de software.

A falta de metodologias ainda um fator limitante deste paradigma.

Concluses

A programao orientada a aspectos a cada dia que passa deixa de ser uma grande promessa para fazer parte do dia-a-dia dos desenvolvedores, ainda que existam detalhes que precisam ser melhor estudados, como a dita falta de metodologia . Pode-se dizer, ainda mais uma vez, que a Orientao a Aspectos prope uma inovao na abstrao do desenvolvimento de softwares como a Orientao a Objetos props em relao programao estruturada.

Referncias

ASPECT-J, Guia Do Programador . in http://aspectj.org/doc/dist/progguide.pdf. ASPECT-J, Tutorial. In http://aspectj.org/doc/dist/tutorial.pdf. ASPECT-J, in www.aspectj.org. DEITEL & DEITEL, Java, How to Program. GROSSO, Willian. Aspect-Oriented Programming & AspectJ . In DrDobbs.com (DDJ.com). LAUREANO, Eduardo. Persistence implementation with Aspect-J. Dissertaao de mestrado, UFPE. PRESMANN, Software Engeneering. SOARES, Srgio. Programao orientada a aspectos em Java, UFPE.

Anexos
O AspectJ

Nesta seo, apresenta-se a linguagem AspectJ, uma extenso orientada a aspectos, de propsito geral, da linguagem Java.

Anatomia de um aspecto

A principal construo em AspectJ o aspecto. Cada aspecto define uma funo especfica que pode afetar vrias partes de um sistema, como, por exemplo, distribuio. Um aspecto, como uma classe Java, pode definir membros (atributos e mtodos) e uma hierarquia de aspectos, atravs da definio de aspectos especializados.

Join Points

Um join point um ponto bem definido no fluxo de execuo de um programa. Alm de afetar a estrutura esttica, um aspecto tambm pode afetar a estrutura dinmica de um programa. Isto possvel atravs da interceptao de pontos no fluxo de execuo, chamados "join points", e da adio de comportamento antes ou depois dos mesmos, ou ainda atravs da obteno do total controle sobre o ponto de execuo. Exemplos de join points so: invocao e execuo de mtodos, inicializao de objetos, execuo de construtores, tratamento de excees, acesso e atribuio a atributos, entre outros. Ainda possvel definir um "join point" como resultado da composio de vrios " join points". Normalmente um aspecto define "pointcuts", os quais selecionam "join points" e valores nestes join points e advices que definem o comportamento a ser tomado ao alcanar os join points definidos pelo pointcut.

O primeiro join point a invocao de um mtodo do objeto A, o qual pode retornar com sucesso, ou levantar uma exceo. O prximo "" a execuo deste mtodo, que por sua vez tambm pode retornar com sucesso ou levantar uma exceo. Durante a execuo do mtodo do objeto A invocado um mtodo do objeto B. A invocao e execuo deste mtodo so " join points", e da mesma forma que os do objeto A podem retornar com sucesso ou levantar uma exceo.

"Pointcut":

"Pointcuts" so formados pela composio de "join points", atravs dos operadores && (e), || (ou), e ! (no). Utilizando "pointcuts" podemos obter valores de argumentos de mtodos, objetos em execuo, atributos e exceces dos "join points". Para definir "pointcuts", identificando os "join points" a serem afetados, utiliza-se construtores de AspectJ chamados designadores de "pointcut" ("pointcut designators"), como os apresentados a seguir.

call(Assinatura) execution(Assinatura) get(Assinatura) set(Assinatura) this(PadroTipo)

Invocao de mtodo/construtor identificado por Assinatura Execuo de mtodo/construtor identificado por Assinatura Acesso a atributo identificado por Assinatura Atribuio de atributo identificado por Assinatura O objeto em execuo instncia de PadroTipo

target(PadroTipo) args(PadroTipo,...) within(PadroTipo)

O objeto de destino instncia PadroTipo Os argumentos so instncias de PadroTipo O cdigo em execuo est definido PadroTipo

em

Onde PadroTipo uma construo que pode definir um conjunto de tipos utilizando "wildcards", como * e + . O primeiro um "wildcard" conhecido, pode ser usado sozinho para representar o conjunto de todos os tipos do sistema, ou depois de caracteres, representandoqualquer seqncia de caracteres. O ltimo deve ser utilizado junto ao nome de um tipo para assim representar o conjunto de todos os seus subtipos. A lista completa de "wildcards" e "pointcut designators" pode ser encontrada em [1].

"Advices ": "Advices " so construes que definem cdigo adicional que dever executar nos " join points". Os advices de AspectJ so apresentados a seguir.

Before() After() returnig() After() throwing() After() Around()

Executa quando o "join point" alcanado, mas imediatamente antes da sua computao Executa aps a computao com sucesso do "join point" Executa aps a computao sem sucesso do "join point" Executa aps a computao do "join point", em qualquer situao Executa quando o "join point" alcanado e tem total controle sobre a sua computao

"Static crosscutting":

Como mencionou-se anteriormente, a linguagem AspectJ permite alterar a estrutura esttica de um programa atravs da adio de membros de classe, da alterao a hierarquia de classes ou da substituio de excees checadas por no checadas.

"Introduction"

O mecanismo que adiciona membros a uma classe chamado "introduction". Em AspectJ classe. A seguir apresenta-se as construes do tipo "introduction" de AspectJ. pode-se introduzir mtodos concretos ou abstratos, construtores e atributos em uma

Modificadores Tipo PadroTipo.Id(Formais){Corpo} Abstract Modificadores Tipo PadroTipo.Id(Formais); Modificadores PadroTipo.new(Formais){Corpo}

Define um mtodo nos tipos em PadroTipo

Define um mtodo abstrato nos tipos em PadroTipo

Define um construtor nos tipos em PadroTipo

A seguir apresenta-se as outras construes em AspectJ que alteram a estrutura esttica de um programa.

Declare parents: PadroTipo extends ListaTipos;

Declara que os tipos em PadroTipo herdam dos tipos em ListaTipos

Declare ListaTipos;

parents:

PadroTipo

implements Declara que os tipos em PadroTipo implementam os tipos em ListaTipos Declara que qualquer exceo de um tipo em

Declare soft: PadroTipo:Pointcut;

PadroTipo que for lanada em qualquer "join point" identificado por "Pointcut" ser encapsulada em uma exceo no checada

Maiores informaes sobre "crosscutting concerns" podem ser encontradas em [1].

Aspectos reusveis:

AspectJ permite a definio de aspectos abstratos, os quais devem ser estendidos provendo a implementao do componente abstrato. Os componentes abstratos podem ser mtodos, como em uma classe Java, e "pointcuts", os quais devem ser definidos em um aspecto concerto, permitindo o reuso do comportamento dos aspectos abstratos.

Consideraes sobre AspectJ:

A linguagem AspectJ uma extenso orientada a aspectos da linguagem Java, permitindo assim a programao orientada a aspectos em Java. Entre as desvantagens da linguagem esto a necessidade de se familiarizar com as novas construes de AspectJ e a pouca maturidade do ambiente de desenvolvimento, resultando em um ambiente ainda no muito estvel. Entretanto, o ambiente teve uma evoluo considervel, estando hoje bem mais estvel que nas verses anteriores. Pontos a melhorar no ambiente de desenvolvimento so o tempo de compilao (weaving) e o tamanho do bytecode gerado. Outra fraqueza de AspectJ a sua poltica de tratamento de excees. O "advice around" o nico tipo de "advice" que suporta a declarao de uma clusula throws. Nos demais no possvel lanar uma exceo checada que j no seja tratada pelos mtodos afetados. A soluo dada utilizar excees "soft", ou seja, encapsular excees checadas em uma exceo no checada (excees do tipo "runtime"). Como este tipo de exceo no obriga o programador a prover o tratamento para a mesma, o programa pode gerar erros inesperados, caso se esquea de prover o tratamento adequado. AspectJ prov construtores muito poderosos, que devem ser utilizados com precauo, uma vez que o uso de "wildcards" pode afetar vrias partes de um programa, inclusive partes indesejadas. A definio de um "pointcut" em AspectJ requer a identificao de pontos especficos de um programa. Como estes pontos so identificados atravs de nomes e tipos de mtodos, parmetros e etc., os aspectos ficam dependentes do sistema, ou da nomenclatura utilizada por ele, dificultando as chances de reuso. Por exemplo, para identificar todas as chamadas de mtodos que inserem dados no sistema poderia-se identificar as invocaes a mtodos com nome "insert", o que obriga a definio de mtodos que inserem dados sempre com este nome, e no "register" ou "add". Isto mostra a necessidade de uso de um padro de nomenclatura, o que tambm beneficia a legibilidade do sistema. Outro suporte ao desenvolvimento por parte de AspectJ so extenses para IDEs (ferramentas CASE de programao) bem disseminadas, como Borland JBuilder. Com isto possvel utilizar estes ambientes de programao para desenvolver sistemas com AspectJ.

Estas extenses tambm permitem visualizar que partes do cdigo so afetadas pelos aspectos. Atualmente esto sendo desenvolvidas extenses para outras IDEs. A maior vantagem de AspectJ a possibilidade de implementar funcionalidades em separado da parte funcional do sistema, e automaticamente inserir ou remover tais aspectos do mesmo. Para remover um aspecto do sistema basta gerar uma nova verso do sistema sem o aspecto que se quer remover. Alm disso, para alterar um aspecto, como mudar o protocolo de distribuio de um sistema, basta implementar outro aspecto de distribuio, e passar a us-lo no processo de recomposio. Com a separao, a legibilidade do cdigo funcional favorecida, uma vez que no h cdigos com diferentes propsitos entrelaados entre si e com cdigo funcional. Isto tambm permite a validao precoce dos requisitos funcionais, antes mesmo da implementao de aspectos como persistncia, distribuio, e controle de concorrncia, tendo assim um desenvolvimento progressivo do sistema.

Alguns exemplos de programas implementados usando AspectJ :


class Line { private Point p1, p2; Point getP1() { return p1; } Point getP2() { return p2; } void setP1(Point p1) { this.p1 = p1; } void setP2(Point p2) { this.p2 = p2; } } class Point { private int x = 0, y = 0; int getX() { return x; } int getY() { return y; } void setX(int x) { this.x = x; } void setY(int y) { this.y = y; } }

O aspecto SubjectObserverProtocol contm todas as partes genricas de um protocolo


abstract aspect SubjectObserverProtocol { abstract pointcut stateChanges(Subject s); after(Subject s): stateChanges(s) { for (int i = 0; i < s.getObservers().size(); i++) { ((Observer)s.getObservers().elementAt(i)).update(); } } private Vector Subject.observers = new Vector(); public void Subject.addObserver(Observer obs) { observers.addElement(obs); obs.setSubject(this); } public void Subject.removeObserver(Observer obs) { observers.removeElement(obs); obs.setSubject(null); } public Vector Subject.getObservers() { return observers; } private Subject Observer.subject = null; public void Observer.setSubject(Subject s) { subject = s; } public Subject Observer.getSubject() { return subject; } }

Note que este aspecto faz trs coisas. Ele define um pointcut abstrato. Ele define advices que deveriam ser executados depois do pointcut. E ele introduz estados e comportamentos sobre o Assunto e as interfaces do Observador

Você também pode gostar