Martin Fowler demonstrating clearly:
Layering is one of the most common techniques that software designers use to
break apart a complicated software system. You see it in machine architectures,
where layers descend from a programming language with operating system calls
into device drivers and CPU instruction sets, and into logic gates inside chips.
Networking has FTP layered on top of TCP, which is on top of IP, which is on
top of ethernet.
When thinking of a system in terms of layers, you imagine the principal subsystems
in the software arranged in some form of layer cake, where each layer
rests on a lower layer. In this scheme the higher layer uses various services
defined by the lower layer, but the lower layer is unaware of the higher layer.
Furthermore, each layer usually hides its lower layers from the layers above, so
layer 4 uses the services of layer 3, which uses the services of layer 2, but layer 4
is unaware of layer 2. (Not all layering architectures are opaque like this, but
most are—or rather most are mostly opaque.)
Breaking down a system into layers has a number of important benefits.
• You can understand a single layer as a coherent whole without knowing
much about the other layers. You can understand how to build an FTP service
on top of TCP without knowing the details of how ethernet works.
• You can substitute layers with alternative implementations of the same
basic services. An FTP service can run without change over ethernet, PPP,
or whatever a cable company uses.
• You minimize dependencies between layers. If the cable company changes
its physical transmission system, providing they make IP work, we don’t
have to alter our FTP service.
• Layers make good places for standardization. TCP and IP are standards
because they define how their layers should operate.
• Once you have a layer built, you can use it for many higher-level services.
Thus, TCP/IP is used by FTP, telnet, SSH, and HTTP. Otherwise, all of these
higher-level protocols would have to write their own lower-level protocols.
From the Library of Kyle Geoffrey Passarelli
Layering is an important technique, but there are downsides.
• Layers encapsulate some, but not all, things well. As a result you sometimes
get cascading changes. The classic example of this in a layered enterprise
application is adding a field that needs to display on the UI, must be
in the database, and thus must be added to every layer in between.
• Extra layers can harm performance. At every layer things typically need to
be transformed from one representation to another. However, the encapsulation
of an underlying function often gives you efficiency gains that more
than compensate. A layer that controls transactions can be optimized and
will then make everything faster.
But the hardest part of a layered architecture is deciding what layers to have
and what the responsibility of each layer should be.